拓扑排序之四
//poj 3687 Labeling Balls
#include <iostream> //逆拓扑排序,从重到轻逐一确定
using namespace std;
int topo[201][201],_in[201],ans[201];
int main()
{
int t,n,m,heavy,light;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(topo,0,sizeof(topo));
memset(_in,0,sizeof(_in));
while(m--)
{
cin>>light>>heavy;
if(!topo[heavy][light]) //若重复输入,则 _in[light]++ 不会重复执行
topo[heavy][light]=1,_in[light]++;
}
int weight=n,i,j;
while(weight>0)
{
for(i=n;i>=1;i--)
if(_in[i]==0)break;
//_in[i]==0表示没有其他元素比它更重,即以目前来说它是最重的,而i值从大到小,因为题目要求靠前面的元素尽量轻,所以靠后面的元素要尽量重
if(i==0)break;
_in[i]=-1; //标记已经确定下来重量了
ans[i]=weight--;
for(j=n;j>=1;j--)
if(topo[i][j]==1)
_in[j]--; //比元素[j]重的元素少了1个
}
if(weight>0)
cout<<"-1"; //对应于上面的if(i==0)break;
else
{
for(i=1;i<=n;i++)
cout<<ans[i]<<" ";
}
cout<<endl;
}
return 0;
}