题目大意:原题链接

给出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. 学习:java代码检测

    转自:http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E5%BC%82%E5%91%B3 对于Java开发语言,有些工具,比如Checkstyle.PM ...

  2. hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. 启动nmon报错while load libncurses.so.5 can not open shared(bit64)

    yum install ncurses-devel.i686 也有可能是软件包本身有问题,换一个try

  4. hdu 4003(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 思路:dp[i][j]表示以i为根选择j个机器人的最小花费,然后就是背包了:dp[u][i]=m ...

  5. VS2010类模板更改,增加版权等等信息

    本文转载自XDOTNET 在开发过程中往往需要在每一个页面(类)增加注释等等内容,VS2010中可以修改模板,在原有模板中增加一个类,会引用System等等命名空间,以及一些程序集.下面我们来看看如何 ...

  6. std::mutex

    构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的. lock(),调用线程将锁住该互斥量.线程调用该函数会发生下面 ...

  7. 解析oracle的rownum,数据库查询结果返回行数设置

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  8. PL/SQL Developer使用技巧、快捷键(转载)

    1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...

  9. 11.Curator扩展库

        Recipes组件包含了丰富的Curator应用的组件.但是这些并不是ZooKeeper Recipe的全部.大量的分布式应用已经抽象出了许许多多的的Recipe,其中有些还是可以通过Cura ...

  10. [ Office 365 开发系列 ] 前言

    前言 本人从接触Microsoft SharePoint Server 2007到目前为止,已经在微软SharePoint的路上已经走了好几年,基于SharePoint平台的特殊性,对微软产品线都有了 ...