题目链接:点击打开链接
拓扑排序模板题。
坑:输入会有重边!wa n次,下次要想到这个。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N,M;
struct node{
int in,id;
}p[505];
bool a[505][505];
int res[505];
bool vis[505];
bool cmp(node a,node b){
if(a.in==b.in) return a.id<b.id;
return a.in<b.in;
}
bool solve(){
int now=0;
while(now<N){
int k;
sort(p+1,p+N+1,cmp);
for(k=1;vis[p[k].id]&&k<=N;k++);
if(p[k].in!=0) return 0;
res[++now]=p[k].id;
vis[p[k].id]=1;
for(int i=1;i<=N;i++){
if(a[p[k].id][p[i].id]) p[i].in--;
}
}
return 1;
}
int main(){
while(cin>>N>>M){
memset(a,0,sizeof(a));
for(int i=1;i<=N;i++){
p[i].id=i;
p[i].in=0;
vis[i]=0;
res[i]=0;
}
for(int i=1;i<=M;i++){
int s,e;
cin>>s>>e;
if(a[s][e]) continue;
a[s][e]=1;
p[e].in++;
}
if(solve()){
for(int i=1;i<=N;i++){
cout<<res[i];
if(i==N) cout<<endl;
else cout<<' ';
}
}
}
return 0;
}