Labeling Balls

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 9641
Accepted: 2636

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, 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 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

                       [Submit]   [Go Back]   [Status]   [Discuss]

 

::做这道题,原先的思路就是从前面往后扫,入度为0的就赋予未被使用的最小值,可是这样无法得到字典序最小。

看了题解才知道,这道题要逆向建图,且从后往前扫,入度为0的赋予当前未使用的最大值。

 

   1: #include <iostream>

   2: #include <cstdio>

   3: #include <cstring>

   4: #include <algorithm>

   5: using namespace std;

   6: typedef long long ll;

   7: const int maxn=40010;

   8: int head[maxn],in[220],ans[220],vis[220];

   9: int cnt,n,m;

  10:  

  11: struct node

  12: {

  13:     int u,v,p;

  14: }e[maxn];

  15:  

  16: int topo()

  17: {

  18:     memset(vis,0,sizeof(vis));//标记数组

  19:     int k=n;

  20:     int i,j,u;

  21:     for(i=1; i<=n; i++)

  22:     {

  23:         for(u=n; u>0; u--)

  24:         {

  25:             if(!vis[u]&&in[u]==0)

  26:                break;

  27:         }

  28:         if(u<=0) return 0;

  29:         vis[u]=1;

  30:         ans[u]=k--;

  31:         for(j=head[u]; j!=-1; j=e[j].p)

  32:         {

  33:             in[e[j].v]--;

  34:         }

  35:     }

  36:     return 1;

  37: }

  38:  

  39: int main()

  40: {

  41:     int T;

  42:     scanf("%d",&T);

  43:     while(T--)

  44:     {

  45:         int ok=1,a,b;

  46:         cnt=0;

  47:         scanf("%d%d",&n,&m);

  48:         memset(head,-1,sizeof(head));

  49:         memset(in,0,sizeof(in));

  50:         while(m--)

  51:         {

  52:             scanf("%d%d",&a,&b);

  53:             e[cnt].u=b;

  54:             e[cnt].v=a;

  55:             e[cnt].p=head[b];

  56:             head[b]=cnt++;

  57:             in[a]++;

  58:             if(a==b) ok=0;

  59:         }

  60:         if(ok==0||topo()==0)

  61:            printf("-1\n");

  62:         else

  63:         {

  64:             for(int i=1; i<=n; i++)

  65:                 printf("%d ",ans[i]);

  66:             printf("\n");

  67:         }

  68:         //printf("\n");

  69:     }

  70:     return 0;

  71: }

POJ 3687 Labeling Balls()的更多相关文章

  1. [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10161   Accepted: 2810 D ...

  2. POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16100   Accepted: 4726 D ...

  3. poj 3687 Labeling Balls【反向拓扑】

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12246   Accepted: 3508 D ...

  4. POJ 3687 Labeling Balls (top 排序)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15792   Accepted: 4630 D ...

  5. poj——3687 Labeling Balls

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14835   Accepted: 4346 D ...

  6. poj 3687 Labeling Balls - 贪心 - 拓扑排序

    Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N ...

  7. poj 3687 Labeling Balls(拓扑排序)

    题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...

  8. POJ 3687 Labeling Balls 逆向建图,拓扑排序

    题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...

  9. poj 3687 Labeling Balls(拓补排序)

    Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...

随机推荐

  1. 支付宝支付集成,上传RSA公钥一直显示格式错误

    碰到同样的问题,支付宝的问题,已有解决方案:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner

  2. c++容器(vector、list、deque)

    vector ,deque 和 list 顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可 ...

  3. SQL Server密码管理的六个危险判断

    当管理SQL Server内在的帐户和密码时,我们很容易认为这一切都相当的安全.但实际上并非如此.在这里,我们列出了一些对于SQL Server密码来说非常危险的判断. 当管理SQL Server内在 ...

  4. CSS3属性transform详解

    在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形处理,本文将对此做详细介绍. 一.旋转 rotate 用法:transform: rotate(45 ...

  5. sql语句创建新登录名和设置权限

    use DBName go --新增用户 exec sp_addlogin '用户名','密码','默认数据库名' --添加登录 exec sp_grantdbaccess N'test' --使其成 ...

  6. linux怎么模糊查找一个文件

    linux如何模糊查找一个文件 在当前目录下搜索指定文件: find . -name test.txt 在当前目录下模糊搜索文件: find . -name '*.txt' 在当前目录下搜索特定属性的 ...

  7. 怎样在win7系统配置数据源

    1.点击桌面的我Windows 图标,找打控制面板 2.进入控制面板主页,选择系统和安全,进入系统和安全 3.进入系统和安全主页后选择管理工具,点击进入 4.进入管理工具后,选择数据源,进行数据源的配 ...

  8. IOS网络编请求响应之URL结构

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 对于我们IOS开发者来说 ...

  9. oGrid 初探

    oGrid 是个还蛮有趣的 pure JavaScript grid 控件 code 并不多而且是纯 JavaScript 写成,一条小龙觉得还算蛮好理解,不像其他几乎都是用 Jquery 为 bas ...

  10. express新旧语法对比

    备个份, 原文: http://stackoverflow.com/questions/25550819/error-most-middleware-like-bodyparser-is-no-lon ...