转 :hdoj 4857 逃生【反向拓扑】
逃生
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2240 Accepted Submission(s):
631
现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。
同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。
负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。
那么你就要安排大家的顺序。我们保证一定有解。
5),表示测试数据的个数。
然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <=
100000),分别表示人数和约束的个数。
然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。
题目是求拓扑排序,但不是按照字典序最小输出,而是要使较小的数排在最前面。
一开始的错误思路:给每个点确定一个优先级(该点所能到达的最小的点),然后用拓扑排序+优先对列正向处理,正向输出。这是错误的,如下样例:
1
5 4
5 2
4 3
2 1
3 1
正确的解法:是反向建边,点大的优先级高,用拓扑排序+优先队列,逆向输出序列即可。
根据每对限制,可确定拓扑序列,但此时的拓扑序列可能有多个(没有之间关系的点的顺序不定)。本题要求较小的点排到前面,则可确定序列。
(1)如果点a和点b有直接和简接的拓扑关系,那么a和b的先后顺序可有拓扑排序确定。
(2)如果点a和点b没有直接和简接的拓扑关系,那么a和b的先后顺序由a和b所能到达的点的确定。
如:
1
3 2
3 1
3 1
应输出结果为 3 1 2
点3 和 点2 没有直接的拓扑关系,但是3到达最小点为1,2到达最小点为2。
综合(1)和(2)本题需要逆向处理。
PS:欧拉回路的路径输出也是逆向输出的。
注意 vector STL中在此处的用处 方便
我还是没看懂为什么要逆序输出,先转过来吧,再继续看看
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define MAX 100005
priority_queue<int>q;//此处应该为从大到小
vector<int> map[MAX];
int indegree[MAX];
int que[MAX];//存储
void topsort(int n)
{
int i;
for(i=1;i<=n;i++)
if(indegree[i]==0)
q.push(i);
int j=0;
memset(que,0,sizeof(que));
while(!q.empty())
{
int v=q.top();
q.pop();
que[j++]=v;
for(int k=0;k<map[v].size();k++)
{
indegree[map[v][k]]--;
if(indegree[map[v][k]]==0)
q.push(map[v][k]);
}
}
for(i=j-1;i>0;i--)
printf("%d ",que[i]);
printf("%d\n",que[0]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=n;i++)
map[i].clear();
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
map[b].push_back(a);//将a放在b的后边,建立反向边的关系
indegree[a]++;
}
topsort(n);
}
return 0;
}
转 :hdoj 4857 逃生【反向拓扑】的更多相关文章
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- hdu 4857 逃生 (拓扑排序+保证最小在前面)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU 4857 (反向拓扑排序 + 优先队列)
题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...
- (hdu) 4857 逃生 (拓扑排序+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄 ...
- HDU 4857 逃生(拓扑排序)
拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...
- HDOJ 4857 逃生
BestHack.....真乱..... 逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU-4857 逃生(反向拓扑排序 + 逆向输出)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 逃生(HDU4857 + 反向拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列 ...
随机推荐
- 来讲讲C#中的类
1.什么是类? 面向对象的语言,最基本的就是类.在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象. 举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人.我们要找个人一起 ...
- CSS Outlines
轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. 轮廓(outline)属性指定了样式,颜色和外边框的宽度. 轮廓(outline)实例 在元素周围画线本例演 ...
- 1.document.write(""); 输出语句
1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4. ...
- javascript 获取 class 样式 重新赋值class样式 为div等系列标签内更改内容
name = document.getElementById(project_not_through_id).className; // 获取目标id的 cla ...
- 软件测试software testing summarize
软件测试(英语:software testing),描述一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程.软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对 ...
- EOF
Process to end of file 就是处理到文件的结束 以经典的 A + B Problem 为例 把每一行的两个数字加起来,然后打印出来,直到文件末尾 c 语言表示:
- Start of Something New
Hi Guys This will be the blog of SCaffrey for some time before he creates his own site:) Have a nice ...
- Python安装及开发环境配置
Python的语法简洁,功能强大,有大量的第三方开发包(模块).同时Python不像java一样对内存要求非常高,适合做一些经常性的任务方面的编程.根据codeeval网站数据统计显示,连续三年,Py ...
- Erlang安装简介
什么是 Erlang? Erlang 由 Ericsson (爱立信公司)开发,用于帮助开发管理许多电信项目的软件.Erlang 的第一个版本发布于 1986 年,1998 年发布了它的第一个开放源码 ...
- cocos2d-iphone加入芒果广告
cocos2d-iphone加入芒果广告的时候在模拟器上显示不出广告 真机上却可以.提示信息如下: AdsMoGo don't start alternate ADDRESPONSE - ADDING ...