题意:给出n个任务,任务不是完全独立的,有些任务必须依赖另外一些任务才能执行;m个任务关系。

输出:n个任务的可能执行顺序;

我的解决方法:这就是个赤裸裸的拓扑排序,直接dfs拓扑每一个任务点,然后再加入没有列入拓扑排序的任务点,集中输出就可以了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define MAXN 110
 5 using namespace std;
 6 
 7 int mat[MAXN][MAXN],num[MAXN],vis[MAXN],cnt;
 8 
 9 void dfs(int x,int n){//递归搜索每个任务;
10     vis[x]=-1;
11     for(int i=1;i<=n;i++)if(mat[x][i]){
12         if(!vis[i])dfs(i,n);
13     }
14     vis[x]=1;
15     num[--cnt]=x;
16 }
17 
18 void topo_sort(int n){//拓扑排序;
19     for(int i=1;i<=n;i++)
20         if(!vis[i])dfs(i,n);
21 }
22 
23 int main(){
24     int n,m;
25     while(scanf("%d%d",&n,&m),n||m){
26         cnt=n;
27         memset(vis,0,sizeof(vis));
28         memset(mat,0,sizeof(mat));
29         int p,q;
30         for(int i=0;i<m;i++){
31             scanf("%d%d",&p,&q);
32             if(p!=q)mat[p][q]=1;//去掉环;
33         }
34         topo_sort(n);
35         for(int i=1;i<=n;i++)//加入没有排序的任务;
36             if(!vis[i])vis[i]=1,num[--cnt]=i;
37         int first=1;
38         for(int i=0;i<n;i++){
39             if(first){printf("%d",num[i]);first=0;}
40             else printf(" %d",num[i]);
41         }
42         printf("\n");
43     }
44     return 0;
45 }
View Code

 

posted on 2013-08-08 15:05  xien0  阅读(189)  评论(0)    收藏  举报