题目链接:点击打开链接
拓扑排序模板题。
坑:输入会有重边!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;
}
本文介绍了一道经典的拓扑排序算法题目,并提供了一个详细的C++实现代码示例。特别注意了输入中可能出现的重边情况,展示了如何通过拓扑排序解决依赖关系问题。
217

被折叠的 条评论
为什么被折叠?



