题目链接 : POJ3687
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8714 | Accepted: 2366 |
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:
- No two balls share the same label.
- 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, b ≤N) 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
5 4 0 4 1 1 1 4 2 1 2 2 1 4 1 2 1 4 1 3 2
Sample Output
1 2 3 4 -1 -1 2 1 3 4 1 3 2 4
Source
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 205, M = 40005;
int map[N][N] = {0}, in[N] = {0}, ans[N];
int main()
{
int t, n, m, a, b, i, j, k;
scanf("%d", &t);
while (t--) {
memset(map,0,sizeof(map));
memset(in,0,sizeof(in)) ;
scanf("%d%d", &n, &m);
for (i = 0; i < m; ++i) {
scanf("%d%d", &a, &b);
if (!map[b][a]) {
map[b][a] = 1;
++in[a];
}
}
for (i = n; i >= 1 ; i--) {
for (j = n ; j >=1 && in[j]; j--) {
if (in[j] < 0) continue;
}
if (j < 1) break;
ans[j] = i ;
in[j] = -1;
for (k = 1; k <= n; ++k)
if (map[j][k]) --in[k];
}
if (i >= 1) printf("-1\n");
else {
printf("%d", ans[1]);
for (i = 2; i <= n; ++i) printf(" %d", ans[i]);
putchar('\n');
}
}
return 0;
}