Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7676 | Accepted: 2059 |
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
题目大意:
就是给你1---n个球,默认情况下重量的关系1<2<3<4....<n,给你几个条件,a,b表示
a比b轻,最后让你求每个球最后的重量。如果在求的过程中,出现有多组解,要字典序最小的那个。
解题思路:
这个题最难的就是在理解题意上,如果题意理解了,就能很容易想到topsort,反向的topsort,这个题还有一个难点,就是优先队列,如果这个题用topsort加上priority_queue,那么答案就非常明了。
代码如下:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
int in[205],ans[205];
bool map[205][205];
int n,num,tot;
bool topsort()
{
int i,temp;
num=0;
priority_queue<int>q;
for(i=1;i<=n;i++)
{
if(in[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
temp=q.top();
q.pop();
ans[temp]=tot--;
for(i=1;i<=n;i++)
{
if(map[temp][i])
{
in[i]--;
map[temp][i]=false;
if(in[i]==0){
q.push(i);
}
}
}
}
if(tot>=1)
return false;
else
return true;
}
int main()
{
int T,m,a,b,i;
bool flag;
scanf("%d",&T);
while(T--)
{
flag=false;
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(!map[b][a])
{
in[a]++;
}
map[b][a]=true;
}
tot=n;
if(topsort()==true)
{
for(i=1;i<n;i++)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[n]);
}
else
{
printf("%d ",ans[i]);
}
}
return 0;
}