1089.拓扑排序
Description
给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE。
Input
第一行为两个整数n(1<=n<=1000)、m(1<=m<=100000);
之后m行,每行两个整数a、b表示一条从a到b的有向边。
Output
若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的。
Sample Input
5 4 1 2 2 3 3 4 4 5
Sample Output
1 2 3 4 5
每次找入度为0的节点。
#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; }
时间: 2024-08-28 05:53:28