拓扑排序之四

//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;
}

  

posted on 2011-08-22 09:16  sysu_mjc  阅读(134)  评论(0编辑  收藏  举报

导航