10305:Ordering Tasks

Ordering Tasks

這題比較簡單,就是拓撲排序,而且肯定是有向無環圖,直接DFS即可。

注意數據讀取,只要 n 和 m 有一個不爲0即可。。。

不考慮是否存在環:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 10;
int m,n,t;
int visited[maxn];
int order[maxn];
int A[maxn][maxn];
void DFS(int i){
    for(int j = 1;j <= n;j++){
        if(!visited[j] && A[i][j]) DFS(j);
    }
    order[t--] = i;
    visited[i] = 1;
}
void TopoSort(){
    for(int i = 1;i <= n;i++){
        if(!visited[i]) DFS(i);
    }
    for(int i = 1;i < n;i++) printf("%d ",order[i]);
    printf("%d\n",order[n]);
}
int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    while(scanf("%d %d",&n,&m) && (n || m)){
        t = n;
        memset(A,0,sizeof(A));
        memset(visited,0,sizeof(visited));
        int a,b;
        for(int i = 0;i < m;i++){
            scanf("%d %d",&a,&b);
            A[a][b] = 1;
        }
        TopoSort();
    }
    return 0;
}

考慮是否存在環:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 10;
int m,n,t;
int visited[maxn];
int order[maxn];
int A[maxn][maxn];
bool DFS(int i){
    visited[i] = -1;
    for(int j = 1;j <= n;j++){
        if(A[i][j]){
            if(visited[j] < 0) return false;
            else if(!visited[j] && !DFS(j)) return false;
        }
    }
    order[t--] = i;
    visited[i] = 1;
    return true;
}
bool TopoSort(){
    for(int i = 1;i <= n;i++) if(!visited[i])
        if(!DFS(i)) return false;
    return true;
}
int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    while(scanf("%d %d",&n,&m),n | m){
        t = n;
        memset(A,0,sizeof(A));
        memset(visited,0,sizeof(visited));
        int a,b;
        for(int i = 0;i < m;i++){
            scanf("%d %d",&a,&b);
            A[a][b] = 1;
        }
        TopoSort();
        for(int i = 1;i < n;i++) printf("%d ",order[i]);
        printf("%d\n",order[n]);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章