3687-Labeling Balls-反向拓扑排序

来源:互联网 发布:stm32jlink 烧录软件 编辑:程序博客网 时间:2024/05/16 14:44

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


题意: 假设原来球一样重,后面告诉的条件,例如2 1 前面的球比后面的球重,把球按照重量排序,重的在后面且序号较大,然后输出每个球的位置,没有处理的球在原来的位子,反向排,从n到1

#include<stdio.h>#include<string.h>#include<stdlib.h>int n,m;int ls[500];int du[250];int map[250][250];void tuo(){   bool flag ;   int c = 0;   int mm;   for(int i = n; i >= 1; i--)   {       flag = false;       for(int j = n; j >= 1; j--)       {           if(du[j]==0)           {               mm = j;               flag = true;               break;           }       }       if(!flag)       {           printf("-1\n");          return;       }       ls[mm] = i;       du[mm]=-1;       for(int j = 1;j <= n; j++)       {           if(map[mm][j])            du[j]--;       }   }   for(int i = 1; i <= n; i++)   {       printf("%d",ls[i]);       if(i < n)        printf(" ");   }   printf("\n");}int main(){    int t;    scanf("%d",&t);    while(t--)    {       scanf("%d%d",&n,&m);       memset(du,0,sizeof(du));       memset(map,0,sizeof(map));       for(int i = 0; i < m; i++)       {           int u,v;           scanf("%d%d",&u,&v);           if(!map[v][u])           {               map[v][u]=1;               du[u]++;           }       }       tuo();    }    return 0;}


0 0
原创粉丝点击