Labeling Balls 3687(拓扑排序+反向建图)

来源:互联网 发布:软件可行性分析报告 编辑:程序博客网 时间:2024/06/03 11:17
Labeling Balls
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 12262 Accepted: 3511

Description

Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 toN in such a way that:

  1. No two balls share the same label.
  2. The labeling satisfies several constrains like "The ball labeled with a is lighter than the one labeled withb".

Can you help windy to find a solution?

Input

The first line of input is the number of test case. The first line of each test case contains two integers,N (1 ≤ N ≤ 200) and M (0 ≤ M ≤ 40,000). The nextM line each contain two integers a and b indicating the ball labeled witha must be lighter than the one labeled with b. (1 ≤ a, bN) There is a blank line before each test case.

Output

For each test case output on a single line the balls' weights from label 1 to labelN. If several solutions exist, you should output the one with the smallest weight for label 1, then with the smallest weight for label 2, then with the smallest weight for label 3 and so on... If no solution exists, output -1 instead.

Sample Input

54 04 11 14 21 22 14 12 14 13 2

Sample Output

1 2 3 4-1-12 1 3 41 3 2 4
#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int map[210][210];int queue[210];int indegree[210];int n,m;void INPUT(){int i,a,b;memset(map,0,sizeof(map));memset(indegree,0,sizeof(indegree));scanf("%d%d",&n,&m);for(i=0;i<m;++i){scanf("%d%d",&a,&b);if(map[b][a]==0){map[b][a]=1;indegree[a]++;}}}void Topo(){int i,j,top,num=0;for(j=n;j>=1;--j){top=-1;for(i=n;i>=1;--i){if(indegree[i]==0){top=i;break;}}if(top==-1)break;queue[top]=j;indegree[top]=-1;for(i=1;i<=n;++i){if(map[top][i]){indegree[i]--;}}}if(j!=0){printf("-1\n");}else{for(i=1;i<=n;++i){printf(i==1?"%d":" %d",queue[i]);}printf("\n");}}int main(){int t;scanf("%d",&t);while(t--){INPUT();Topo();}return 0;}

0 0
原创粉丝点击