拓扑排序 球的重量分别1~n 需要给他们标号1~n
有m个条件 每个条件为a b 表示标号为a的球比b的球轻
尽量把轻的球给小编号
按顺序输出1~n编号对应的球
倒序建图拓扑即可
代码如下
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int in[201],inn[201],wz[201];
bool mp[201][201];
bool Topo(int n,int op)
{
int i,j,k;
for(i = 1; i <= n; ++i) inn[i] = in[i];
for(i = n; i >= 1; --i)
{
for(j = n; j >= 1; --j)
{
if(!inn[j]) break;
}
if(!j) return 0;
wz[j] = i;
inn[j]--;
for(k = 1; k <= n; ++k)
{
if(mp[k][j])
{
if(!inn[k]) return 0;
inn[k]--;
}
}
}
return 1;
}
int main()
{
int n,m,t,a,b,i;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
memset(in,0,sizeof(in));
memset(mp,0,sizeof(mp));
while(m--)
{
scanf("%d %d",&a,&b);
if(!mp[a][b])
in[a]++;
mp[a][b] = true;
}
if(Topo(n,0))
{
for(i = 1; i <= n; ++i)
{
if(i > 1) putchar(' ');
printf("%d",wz[i]);
}
puts("");
}else puts("-1");
}
return 0;
}