poj 3687 Labeling Balls

Description

Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N 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 with b".

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 next M line each contain two integers a and b indicating the ball labeled with a 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 label N. 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

题意::N个标签分别是1,2,3......N。N个小球,质量分别是1,2,3.....N。现在给球贴标签,有M个限制条件。其中每个限制条件为贴标签a的球要比贴标签b的球轻。
依次输出标签1的球的质量,标签2的球的质量.........且字典序最小。

题解:如果没有字典序最小的限制条件,那么标签a比标签b轻,则建一条边从a到b。如果图存在环在,则无解。如果图没环,直接进行拓扑排序(正向),将每次选出的点贴给当前最小的质量的
球,
即可求得一组解。
题目要求让字典序最小,刚开始想的是正向建图,然后每次选取一个最小的质量用队列进行拓扑排序,可是这样是错误的,这样只能保证在每一步(当前情况,题目要求得是结果)的选择中使当前入度为0并且编号最小的球重量最小,
并不能保证得到的结果中编号最小的球重量最轻。后来采用了反向建图,在拓扑排序中每一步选择当前最大的编号给他分配当前最大的重量(即此时入度为零的球),这样可以保证得到的结果f
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cstdlib>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <limits>
10 #define MAX 205
11 
12 using namespace std;
13 int G[MAX][MAX];
14 int in[MAX];
15 int data[MAX];
16 int main()
17 {
18     int t;
19     scanf("%d",&t);
20     while(t--)
21     {
22         // getchar();
23         int a,b,m,n;
24         scanf("%d%d",&n,&m);
25         memset(G,0,sizeof(G));
26         memset(in,0,sizeof(in));
27         while(m--)
28         {
29             scanf("%d%d",&a,&b);
30             if(!G[b][a])//重复边
31             {
32                 G[b][a]=1;
33                 in[a]++;
34             }
35         }
36         int k=0;
37         for(int i=n; i>=1; i--)
38         {
39             int flag=1,s;
40             for(int j=n; j>=1; j--)
41                 if(in[j]==0)
42                 {
43                     data[j]=i;//i为最外层的循环,将当前度为零的即最大的质量放在最大编号球
44                     in[j]--;
45                     flag=0;
46                     k++;
47                     s=j;
48                     break;
49                 }
50             if(flag)
51             {
52                 k=0;
53                 break;
54             }
55             for(int j=n; j>=1; j--)
56                 if(G[s][j])
57                     in[j]--;
58         }
59         if(k!=n)
60         {
61             printf("-1");   printf("\n");
62         }
63         else
64             for(int i=1;i<=n;i++)
65                 printf("%d%c",data[i],i==n?'\n':' ');
66 
67     }
68     return 0;
69 }
View Code

 

全部评论

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
2025-12-28 22:19
门头沟学院 Java
不敢追165女神:简历写得毫无特点,你说你要是大二或者大三找寒假实习到暑期实习这段时间,你的简历还能约到面试。但是你是研究生哥,面试官不会因为你是研究生而降低要求,反而会觉得你是研究生才学了这么一点?为什么我不找个同阶段的本科生?
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务