POJ 3687 Labeling Balls()
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:
- No two balls share the same label.
- 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
[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()的更多相关文章
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16100 Accepted: 4726 D ...
- poj 3687 Labeling Balls【反向拓扑】
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12246 Accepted: 3508 D ...
- POJ 3687 Labeling Balls (top 排序)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15792 Accepted: 4630 D ...
- poj——3687 Labeling Balls
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14835 Accepted: 4346 D ...
- 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 ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- POJ 3687 Labeling Balls 逆向建图,拓扑排序
题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...
- poj 3687 Labeling Balls(拓补排序)
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
随机推荐
- Ubuntu搭建Android交叉编译环境
一.下载 Android NDK Android NDK官方下载页:http://developer.android.com/tools/sdk/ndk/index.html如果需要旧版本的,比如10 ...
- C#设计模式——观察者模式(Observer Pattern)
一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...
- WebApi 登录身份验证
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- 【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法
前言: 最近在做中国移动爬虫的过程中,首先遇到的就是 在某个请求中,有一个名为“WT_PFC"的cookie键值是由前端JavaScript生成的,没有进入到HttpWebResponse中 ...
- 基于吉日嘎底层架构的Web端权限管理操作演示-角色管理
上一篇介绍了用户管理,这篇来介绍角色管理,这是权限管理的核心部分,因为我们的权限管理系统是基于角色的,有个高大上的英文名叫RBAC(Role Based Acccess Control). 下面的这段 ...
- 数据库sqlserver2008登陆名密码登陆不了怎么办?
我用的是sql server2008数据库,原先创建的登录名是sa,但是密码就忘了.总是出现这个连接问题
- FreeBSD的新一代包管理工具Pkg 1.3.0 发布
Pkg 是 FreeBSD 下一代的打包管理工具,用来替代原来的 pkg_info/pkg_create/pkg_add 工具,可以本地打包,也提供远程打包,主要是为了方便远程二进制包升级. Pkg ...
- linux下导入、导出mysql数据库命令 下载文件到本地
一.下载到本地 yum install lrzsz sz filename 下载 rz filename 上传 linux下导入.导出mysql数据库命令 一.导出数据库用mysqldump命 ...
- jetty加载spring-context容器源码分析
带着疑问开始 web.xml的顺序问题 先拿一个最简单的spring mvc web.xml来说问题,如下图:如果我将三者的顺序倒置或是乱置,会产生什么结果呢? 启动报错?还是加载未知结果?还是毫无影 ...
- 使用一般处理程序HTTPHandler下载文件
一般来说我们可以用HTTPHandler来处理一些简单的逻辑,比如验证码.下载文件等. 以下载word文档为例讲解一下如何在HHTPHandler中下载文件,不限于word文档,如果下载其他文件,需要 ...