hiahiahia我又回来了!!
题意:
理解题意很重要嗯
给定几个标签球的重量大小关系,求每个球是第几重的(即每个球在所有球的重量中由小到大排名是多少)。也可以认为是重量嘛,就是第1号位置的球重4一类的。
如果存在多种可行解,就按编号小得重量尽量小输出
↑↑↑重点
思路:
拓扑。
但是
逆序的!!
why?
因为正序的你不能确定,让编号小的重量尽量小。
但是你把编号大的重量也弄大,那么小的一定就越小啦!!
【哀家】要回家啦。。
不知道解释清楚没有。。
实在不行看代码吧!!
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int map[260][260];
int cnt[260];
int vis[260];
int w[260];
int n,m;
int jy;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(map[v][u]==0)
{
map[v][u]=1;
cnt[u]++; //比u重的
}
}
for(int i=n;i>=1;i--) //重量从大到小排 。
{
jy=1;
for(int j=n;j>=1;j--) //编号也从大到小排,就是先把后面的搞一搞
{
if(cnt[j] == 0) //入度为0 的,注意这个也得从大了往小搜!!!
//,所以说一开始输入数据是也得反着建。
//意思就是较重的小球入度为0,先从重的开始嘛~~
{
jy=0;
cnt[j]--; //编号-1
w[j]=i; //j编号的重量为i;
for(int k=1;k<=n;k++)
{
if(map[j][k] == 1) //j比k重的
{
cnt[k]--;
//map[j][k]=0;
}
}
break;
}
}
if(jy == 1)break;
}
if(jy == 1)
{
printf("-1\n");
}
else
{
for(int i=1;i<=n;i++)
{
if(i == n)
{
printf("%d\n",w[i]);
}
else
{
printf("%d ",w[i]);
}
}
}
}
}