题目大意:原题链接

给出N个未编号的质量各不相同的球,以及它们质量轻重的大小关系,给它们从1~N贴标签编号,无重复。问是否存在可行的编号方法,不存在输出-1,

如果存在则输出唯一一种方案,此方案是使得编号小的球的重量尽量轻,先是编号为1的重量要最轻,其次比编号2,以此类推......

思路:当解有多组时,编号小的质量尽量小。所以就采用逆拓扑排序(正向的贪心不能完全保证序号小的节点尽量排在前面。仔细思考~~~~~)

按编号从大到小,找质量最大的。这样,小标签就都留给了质量小的。比如4-->1,3-->2这个图(答案是2 4 3 1),

如果正向的话先出来的是3,然后是2,然后是4,最后才是1,输出(3 2 4 1)是个反例,而反向的话却可以保证把小的尽可能留给小标号的

解法一:逆拓扑排序+贪心

#include<cstdio>
#include<cstring>
#define maxn 210
using namespace std;
int n,m,out[maxn],q[maxn];
int i,j,k,graph[maxn][maxn]; bool Toposort(){
for(i=n;i>=;i--){//按编号从大到小
for(j=n;j>=;j--){//找质量最大的
if(!out[j]){
q[j]=i;
out[j]=-;
break;
}
}//j未通过break退出循环,说明无零出度节点,有环
if(j<) return false;
for(k=;k<=n;k++){
if(graph[k][j])
out[k]--;
}
}
return true;
} int main(){
int T,u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(graph,,sizeof(graph));
memset(out,,sizeof(out));
for(i=;i<m;i++){
scanf("%d%d",&u,&v);
if(!graph[u][v]){
graph[u][v]=true;
out[u]++;
}//注意重边
}
if(Toposort()){
for(i=;i<=n;i++){
if(i!=n) printf("%d ",q[i]);
else printf("%d\n",q[i]);
}
}
else printf("-1\n");
}
}

解法二:逆拓扑排序+优先队列

#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 210
using namespace std;
int n,m,out[maxn],va[maxn];
int graph[maxn][maxn];
priority_queue<int> que;
bool Toposort()
{
for(int i=;i<=n;i++){
if(!out[i])
que.push(i);
}
if(que.empty()) return false;//注意
int t=n;
while(!que.empty()){
int j=que.top();
que.pop();
va[j]=t--;
for(int k=;k<=n;k++){
if(graph[k][j]){
graph[k][j]=;
out[k]--;
if(!out[k])
que.push(k);
}
}
}
if(t) return false;//注意
return true;
} int main()
{
int T,u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(graph,,sizeof(graph));
memset(out,,sizeof(out));
for(int i=;i<m;i++){
scanf("%d%d",&u,&v);
if(!graph[u][v]){
graph[u][v]=true;
out[u]++;
}//注意重边
}
if(Toposort()){
for(int i=;i<n;i++)
printf("%d ",va[i]);
printf("%d\n",va[n]);
}
else printf("-1\n");
}
}

PKU 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(拓扑排序)

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

  3. POJ3687.Labeling Balls 拓扑排序

    Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...

  4. Java实现Labeling Balls(拓扑排序的应用)

    1 问题描述 给出一些球,从1N编号,他们的重量都不相同,也用1N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a , b >要求编号为 a 的球必须 ...

  5. 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 ...

  6. POJ 3687 Labeling Balls【拓扑排序 优先队列】

    题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...

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

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

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

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

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

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

随机推荐

  1. hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)

    再遇攻击 Time Limit: 1000 MS    Memory Limit: 65536 K Total Submit: 253(37 users)   Total Accepted: 56(2 ...

  2. GCC命令基础

    gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点, 现在很多程序员都应用GCC,怎样才能更好的应用GCC. 目前,GCC可 ...

  3. ios开发之--使用AFNetWorking 3.1.0 ,简单的请求封装类

    从苹果系统自带的请求类,到ASIHttpRequest第三方请求类,再到AFNetWorking第三方请求类,目前只要牵扯到数据请求,基本上都是用AFN,所以,这里纯粹是记录下: hRequestTo ...

  4. iOS开发之--实现倒计时显示时分秒

    这段时间写公司的一个外包项目,需要用到倒计时:需要显示时分秒,通过在网上搜集资料,找到了2中方法,我把这两种方法结合起来,可以很好的满足这个需求: 1.创建一个类继承自UIlabel,用来展示时分秒的 ...

  5. SensorManager

    光照传感器 Android 中每个传感器的用法其实都比较类似,真的可以说是一通百通了.首先第一步要获取到 SensorManager 的实例 SensorManager senserManager = ...

  6. Android无线测试之—UiAutomator UiScrollable API介绍七

    滑动到某个对象 一.滑动到某个对象相关API 返回值 API 描述 boolean scrollIntoView(UiSelector selector) 滑动到条件元素所在位置,并且尽量让其居于屏幕 ...

  7. webstorm配置内存参数,解决卡顿

    找到WebStorm.exe.vmoptions这个文件,路径如下webstorm安装主目录>bin>WebStorm.exe.vmoptions更改为第二行:-Xms526m第三行:-X ...

  8. poj_1464 动态规划

    题目大意 N个节点构成一棵树形结构,在其中若干个节点上放置士兵,与被放置士兵的节点相连的边会被士兵看守.问需要至少在多少个节点上放置士兵,才能使得N-1条边都被看守. 题目分析 题目描述的结构为树形, ...

  9. nginx提高加载静态文件速度

    1.本来对于静态网页,我们不需要放在应用容器中,原因一时由于应用服务器是用来解析动态网页的,针对静态网页本来就性能不高,而且还会占用应用容器的资源,所以我们专门使用nginx用来解析静态网页.     ...

  10. vim学习选取多行(转)

    在可视化模式下,可以对一个文本块的整体进行操作.例如,首先高亮选中一部分文本,然后用d命令删除这个文本块.可视化模式的好处在于,你可以在做改动之前,就看到操作将影响的文本.可视化模式可以分为以下三种: ...