题目地址:https://vjudge.net/problem/UVA-10305
掌握这个题要先自己理解理解、学习学习拓扑排序,这个题不就是最典型的的拓扑排序么,理解之后就该想怎么去实现了,在这里我不是用G[i][j]=1的情况去标记,而是用z[i][j]中的j从1开始存储i的直接后端,如果没有就令其为-1.
上代码:
#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int main()
{
int m,n;
int s[105];
int z[105][105];
while(cin>>m>>n){
if(m==0&&n==0) break;
memset(s,0,sizeof(s));
memset(z,-1,sizeof(z));
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
s[b]++;
for(int j=1;;j++){
if(z[a][j]!=-1)
continue;
else{
z[a][j]=b;
break;
}
}
}
stack <int> p;
int a[105];
int cnt=0;
for(int i=1;i<=m;i++){
if(s[i]==0){
p.push(i);
a[cnt++]=i;
}
}
while(!p.empty()){
int i=p.top();
p.pop();
for(int j=1;z[i][j]!=-1;j++){
int c=z[i][j];
s[c]--;
if(s[c]==0){
p.push(c);
a[cnt++]=c;
}
}
}
printf("%d",a[0]);
for(int i=1;i<cnt;i++){
printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}