5 4 1 2 2 3 3 4 4 5
1 2 3 4 5
#include<cstdio> #include<cstring> #include<vector> #include<string> #include<iostream> using namespace std; const int maxn=1010; int out[maxn]={0},c[maxn]={0},n,m,x,cnt=0; vector<int>G[maxn]; vector<int>topo; bool toposort(){ while(cnt!=n){ bool key=false; for(int i=1;i<=n;i++)//每次找入度为0的节点 if(out[i]==0&&c[i]==0){ c[i]=1; x=i; key=true; break; } if(key==false) return false;//存在环 topo.push_back(x); cnt++; for(int i=0;i<G[x].size();i++) out[G[x][i]]--; } return true; } int main(){ scanf("%d%d",&n,&m); int u,v; for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); out[v]++; } if(toposort()){ for(int i=0;i<n;i++){ if(i!=0) printf(" "); printf("%d",topo[i]); } printf("\n"); } else printf("IMPOSABLE\n"); return 0; }
原文地址:http://blog.csdn.net/a995549572/article/details/46551957