题意:给出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 }
浙公网安备 33010602011771号