题意:有n个球,重量各不相同,为1-n,现在要给其贴上标签(1-n)
规则为每个球的标签各不相同,且标签为a的球要比标签为b的重
输出标签为1-n的重量,注意若有多组答案,输出让标签小的更轻的那组,即球号较小的球质量应取到最小
需要逆向建图
给两组样例
2
5 4
5 1
4 2
1 3
2 3
10 5
4 1
8 1
7 8
4 1
2 8
ans:
2 4 5 3 1
5 1 6 2 7 8 3 4 9 10
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int N,n,m,i,j,k,a,b,flag,t[205][205],r[205],v[205],s[205];
scanf("%d",&N);
while(N--){
flag=1;
scanf("%d%d",&n,&m);
memset(r,0,sizeof(r));
memset(v,0,sizeof(v));
memset(t,0,sizeof(t));
while(m--){
scanf("%d%d",&a,&b);
if(!t[b][a]){
t[b][a]=1;
r[a]++;
}
}
for(i=n;i>=1;i--){
for(j=n;j>=1;j--)
if(!r[j]&&!v[j]){
s[j]=i; //s[i]=j;
v[j]=1;
break;
}
if(j==0){
flag=0;
break;
}
for(k=1;k<=n;k++)
if(t[j][k])
r[k]--;
}
if(flag){
//for(i=1;i<=n;i++)
// v[s[i]]=i;
for(i=1;i<n;i++)
printf("%d ",s[i]);
printf("%d\n",s[n]);
//for(i=1;i<n;i++)
// printf("%d ",v[i]);
// printf("%d\n",v[n]);
}
else
printf("-1\n");
}
return 0;
}
注释掉的是第二种写法