poj3687
题意:有n个球,质量分别是1~n,然后告诉你编号为x的球比编号为y的球轻,问这n个球的排列方式,如果有多种就质量越小的编号尽量小
题解:拓扑排序,不过..不能从1开始做,而应该从开始倒着做!!!
因为我们需要从先前最小,如果从前开始做不能保证…
#include <cstdio>
#include <cstring>
#define N 220
int T,m,n,cnt[N],mp[N][N],ans[N];
bool sort(){
for(int i=n;i>=1;i--){
int flag=1;
for(int j=n;j>=1;j--){
if(!cnt[j] && !ans[j]){
ans[j]=i;flag=0;
for(int k=1;k<=n;k++) if(mp[j][k]) cnt[k]--;
break;
}
}if(flag) return false; //有环
}
return true;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);int flag=1;
memset(mp,0,sizeof(mp));
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
if(x==y) flag=0;//这种情况不能构成 总不能第x个球比第x个球轻吧(逃
if(!mp[y][x]){
mp[y][x]=1;
cnt[x]++;
}
}if(!flag || !sort()){printf("-1\n");continue;}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);printf("\n");
}
return 0;
}