PKU 3687 Labeling Balls(拓扑排序)
题目大意:原题链接
给出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(拓扑排序)的更多相关文章
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- POJ3687.Labeling Balls 拓扑排序
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...
- Java实现Labeling Balls(拓扑排序的应用)
1 问题描述 给出一些球,从1N编号,他们的重量都不相同,也用1N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a , b >要求编号为 a 的球必须 ...
- 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【拓扑排序 优先队列】
题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...
- poj 3687 Labeling Balls【反向拓扑】
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12246 Accepted: 3508 D ...
- poj 3687 Labeling Balls(拓补排序)
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
- POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16100 Accepted: 4726 D ...
随机推荐
- JAVA 并发编程-多个线程之间共享数据(六)
多线程共享数据的方式: 1.假设每一个线程运行的代码同样.能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做. 2,假设每一个线程运行的代码不同. ...
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- ChemDraw中化学信息怎么通过Excel搜索
用户可以通过ChemDraw for Excel插件功能在Office Excel中建立ChemOffice菜单将ChemOffice和Excel结合使用,使用电子表格的最大优势之一就是可以清晰查看并 ...
- leetcode -- Maximal Rectangle TODO O(N)
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- OSG简单测试框架
#include <osgDB/ReadFile> #include <osgDB/FileUtils> #include <osg/ArgumentParser> ...
- Objective-C代码学习大纲(6)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...
- iOS 7 Master-Detail模板不好用
将storyboard->use size classes disabled
- ios 自定义UITableView中分组的标题sectionview
//Section的标题栏高度 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)sec ...
- kafka 相关配置
kafka主要配置包括三类:broker configuration,producer configuration and consumer configuration. Broker Config ...
- jQuery照片墙相册
效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/30.htm 本特效支持jquery的版本为1.4.3,暂时不支持1.9以上jquery版本. 代码: < ...