无奈了,巨坑陷阱题加读错题导致了N个WA。
题意是这样的:
给定几个标签球的重量大小关系,求每个球是第几重的(即每个球在所有球的重量中由小到大排名是多少)。
(输出是每个球第几重,而不是几号球比几号球重!)。
此题重点是:
1、需要逆序拓扑,找入读为零的点时要从大到小找。
2、注意最后的处理,是输出几号球是第几重的!!
例如:拓扑出的序列是1 4 2 3 5,就是4号球比1号球重,2号球比4号球重,输出序列是1 3 4 2 5,即1号球最轻,2号球第三轻……
是不是你也突然发现你读错题了?
下面是代码:
#include <stdio.h>
#include <string.h>
const int M=205;
int n,cut,head[M],map1[M][M],ji[M];
int topo()
{
int i,in=-1,ind,di[M],j,k;
cut=0;
for(i=0; i<n; i++)
{
di[i]=0;
for(j=0; j<n; j++)
{
di[i]+=map1[j][i];
}
}
for(i=0; i<n; i++)
{
for(j=n-1; j>=0; j--)
{
if(di[j]==0)
{
di[j]=-1;
break;
}
}
if(j==-1)
{
return 0;
}
for(k=0; k<n; k++)
{
di[k]-=map1[j][k];
}
ji[i]=j;
}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,m,flat=1,a,b,ans[M];
scanf("%d%d",&n,&m);
memset(map1,0,sizeof(map1));
for(i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
a--;
b--;
map1[b][a]=1;
}
i=topo();
if(i)
{
for(i=0; i<n; i++)//最后的数据处理
{
ans[ji[i]+1]=n-i;
}
for(i=1; i<n; i++)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[n]);
}
else
{
printf("-1\n");
}
}
return 0;
}