POJ3687.Labeling Balls 拓扑排序
Labeling Balls
Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 13201
Accepted: 3811
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
题目链接:
http://poj.org/problem?id=3687
题意:,有N个质量不同的球,分别为1~N.每个测试数据a,b表示两个球的质量a<b.输出编号1~N的球的质量.如果存在多个方案,则输出编号为1的球质量最轻的方案,如果还是有多个方案,则输出编号为2得球质量最轻的方案,以此类推.
思路:输出的是质量,而不是编号.所以,输出的是编号所在的位置.这道题目用的是逆拓扑排序.先确定哪些球的入出为0,说明他们的质量是最大的一批,选取其中编号最大的球最为质量最大的球,重复此步骤.最后输出1~N号球的质量.
例:

不考虑输出要求。进行拓扑排序的结果(序号)
- 1 4 5 3 2
- 1 5 3 4 2
- 1 5 4 3 2
- 5 1 3 4 2
- 5 1 4 3 2
- 5 3 1 4 2
这所有的情况,第2种符合题目要求。那么输出为1 5 3 4 2(这里并不是序号,而是质量,即每个序号所在的位置)。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,num;
int sign[];
int in[],out[];
int indegree[][],outdegree[][];
struct node
{
int p,m;
} ans[];
int cmp(node a,node b)
{
return a.p<b.p;
}
int Topsort()
{
int i,j,t;
num=;
for(t=; t<n; t++)
{
for(i=n; i>=; i--)
{
if(sign[i]==&&out[i]==)
break;
}
if(i<=) return -;
else
{
sign[i]=;
ans[num].p=i;
ans[num].m=n-(num++);
for(j=; j<in[i]; j++)
out[indegree[i][j]]--;
}
}
return ;
}
int main()
{
int i,T,u,v;
cin>>T;
while(T--)
{
cin>>n>>m;
memset(in,,sizeof(in));
memset(out,,sizeof(out));
memset(indegree,,sizeof(indegree));
memset(outdegree,,sizeof(outdegree));
for(i=; i<m; i++)
{
scanf("%d%d",&u,&v);
if(outdegree[u][out[u]]==)outdegree[u][out[u]++]=v;
if(indegree[v][in[v]]==)indegree[v][in[v]++]=u;
}
for(i=; i<=n; i++) sign[i]=;
if(Topsort()<) cout<<"-1"<<endl;
else
{
sort(ans,ans+n,cmp);
for(i=; i<n-; i++)
cout<<ans[i].m<<" ";
cout<<ans[i].m<<endl;
}
}
return ;
}
/*
2 5 4
1 4
4 2
5 3
3 2 5 3
1 4
4 2
3 5 ans=
1 5 3 4 2
1 3 4 2 5
*/
POJ3687.Labeling Balls 拓扑排序的更多相关文章
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- [poj3687]Labeling Balls_拓扑排序
Labeling Balls poj-3687 题目大意:给出一些球之间的大小关系,求在满足这样的关系下,编号小的尽量比编号大的球的方案. 注释:1<=N(球的个数)<=200,1< ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- PKU 3687 Labeling Balls(拓扑排序)
题目大意:原题链接 给出N个未编号的质量各不相同的球,以及它们质量轻重的大小关系,给它们从1-N贴标签编号,无重复.问是否存在可行的编号方法,不存在输出-1, 如果存在则输出唯一一种方案,此方案是使得 ...
- Java实现Labeling Balls(拓扑排序的应用)
1 问题描述 给出一些球,从1N编号,他们的重量都不相同,也用1N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a , b >要求编号为 a 的球必须 ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...
- POJ-3687 Labeling Balls(拓扑)
不一样的拓扑排序 给定一些标记为1到n的数, 求出满足a < b 的序列, 如果有多个输出, 按先标签1往前的位置, 然后按标签2往前的位置, 对于每个标签, 位置都尽量往前. 因为位置要往前, ...
- POJ3687 Labeling Balls
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13645 Accepted: 3955 Description Wind ...
随机推荐
- Noip知识点备考
作为一个oier,适当的整理是有必要的.蒟蒻根据自己的理解,筛选出考noip应当掌握的知识点.可能后期还有解题思路和模板,先挖个坑慢慢补呗. 60级张炳琪Noip知识点总结 可能是本人比较弱,写的内容 ...
- VueCli
Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工具能够基于智能的默认配置即可平稳衔接,这样你可以专注在撰写 ...
- 在 mvc 4 中使用 unity 进行依赖注入
在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc ...
- Flutter,最好的跨平台开发框架
今天说说使用flutter的一些体会 对于Flutter,从发现到接触再到使用,不知不觉,已经有大半年了!在这段时间里,谷歌几乎每天都会更新Flutter,有时甚至一天更新几次,这让我对它更加充满信心 ...
- J2SE 8的反射
1.获得Class的四种方式 //(1) 利用对象调用getClass()方法获取该对象的Class实例 Class<? extends ReflectTest> class1 = new ...
- class(类的使用说明)
class 的三大特性 封装:内部调用对于外部用户是透明的 继承: 在分类里的属性,方法被自动继承 多态:调用这个功能,可以使多个类同时执行 r1 = Role(r1, 'Alex', 'Police ...
- 9 并发编程-(线程)-守护线程&互斥锁
一 .守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 1.对主进程来说,运行完毕指的是主进程代码运行完毕 2.对主线程来说,运行完毕 ...
- Mybatis知识(4)
1.当实体类中的属性名和表中的字段名不一样 解决办法①: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致 <select id=”selectorder” para ...
- liblas 1.8.1编译安装
liblas https://github.com/libLAS/libLAS/issues/102 https://liblas.org/start.html 源码 https://github.c ...
- spark性能调优 数据倾斜 内存不足 oom解决办法
[重要] Spark性能调优——扩展篇 : http://blog.csdn.net/zdy0_2004/article/details/51705043