hdu 4857(好题,反向拓扑排序)
逃生
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3652 Accepted Submission(s): 1040
现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。
同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。
负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。
那么你就要安排大家的顺序。我们保证一定有解。
然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。
然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。
5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2
6 -> 3 -> 1
5 -> 4 -> 2
直接拓扑排序的结果是:5 4 2 6 3 1 ,结果是错误的,因为我们可以把1号安排到更前面的位置 即:6 3 1 5 4 2(正确答案)。
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
#include <vector>
#include <functional>
#include <string.h>
using namespace std;
priority_queue<int>q;
const int N = ;
const int M = ;
int p[N];
int indegree[M];
struct Edge{
int v,next;
}edge[N];
int head[M];
void addEdge(int u,int v,int &k){
edge[k].v = v,edge[k].next = head[u],head[u]=k++;
}
int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
head[i] = -;
indegree[i] = ;
}
int tot = ;
for(int i=;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
addEdge(b,a,tot); ///重点,反向弧
indegree[a]++;
}
for(int i=;i<=n;i++){
if(indegree[i]==){
q.push(i);
}
}
int k = ;
int id = ;
while(!q.empty()){
int u = q.top();
p[id++] = u;
q.pop();
for(int k = head[u];k!=-;k=edge[k].next){
if(indegree[edge[k].v]>) indegree[edge[k].v]--;
if(indegree[edge[k].v]==) q.push(edge[k].v);
}
}
for(int i=id-;i>;i--){
printf("%d ",p[i]);
}
printf("%d\n",p[]);
}
}
错误代码:
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
#include <vector>
#include <functional>
#include <string.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
const int N = ;
const int M = ;
int p[N];
int indegree[M];
struct Edge
{
int v,next;
} edge[N];
int head[M];
void addEdge(int u,int v,int &k)
{
edge[k].v = v,edge[k].next = head[u],head[u]=k++;
}
int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
head[i] = -;
indegree[i] = ;
}
int tot = ;
for(int i=; i<m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
addEdge(a,b,tot);
indegree[b]++;
}
for(int i=; i<=n; i++)
{
if(indegree[i]==)
{
q.push(i);
}
}
int k = ;
int id = ;
while(!q.empty())
{
int u = q.top();
q.pop();
p[id++] = u;
for(int k = head[u]; k!=-; k=edge[k].next)
{
if(indegree[edge[k].v]>) indegree[edge[k].v]--;
if(indegree[edge[k].v]==) q.push(edge[k].v);
}
}
for(int i=; i<id-; i++)
{
printf("%d ",p[i]);
}
printf("%d\n",p[id-]);
}
}
hdu 4857(好题,反向拓扑排序)的更多相关文章
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 4857 逃生(反向拓扑排序+优先队列)
( ̄▽ ̄)" //这题对序号输出有要求,较小的序号优先输出,所以用到优先队列 //优先队列是优先弹出值最大的,所以最后要反向输出结果,才是正确的output #include<iost ...
- HDU 4857 逃生(反向拓扑排序)
传送门 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社 ...
- hdu 4857 逆向建图+拓扑排序 ***
题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...
- HDU 2647 Reward【反向拓扑排序】
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 逃生(HDU4857 + 反向拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列 ...
- CF-825E Minimal Labels 反向拓扑排序
http://codeforces.com/contest/825/problem/E 一道裸的拓扑排序题.为什么需要反向拓扑排序呢?因为一条大下标指向小下标的边可能会导致小下标更晚分配到号码,导致字 ...
- HDU.3342 Legal or Not (拓扑排序 TopSort)
HDU.3342 Legal or Not (拓扑排序 TopSort) 题意分析 裸的拓扑排序 根据是否成环来判断是否合法 详解请移步 算法学习 拓扑排序(TopSort) 代码总览 #includ ...
- HDU.1285 确定比赛名次 (拓扑排序 TopSort)
HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...
随机推荐
- hive的常用HQL语句
1.过滤条件 where .limit. distinct. between and . null. is not nullselect * from emp where sal > 3000; ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
D. MADMAX time limit per test1 second memory limit per test256 megabytes Problem Description As we a ...
- UVALive 4685 Succession 树DP+背包
一.前言 这道题同样来自于红书P142,作为树DP专题中的一道比较难的题目,A了一天左右的时间,看上去事实证明,这题的难度理我本身的实力还是有些太远了,于是正确的做法应该是分析一下题目之后进行解析什么 ...
- ipv4配置
- mysql基础查询
#进阶1:基础查询/*语法:select:查询列表 from 表名; 类似于:System.out.println(打印的东西); 特点:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的 ...
- jdk -version could not open jvm.cfg 的解决办法
java 时出现 could not open jvm.cfg 的解决办法 问题描述: 重装JDK并更变目录后,出现JAVA -VERSION 出现could not open jvm.cf ...
- jquery实现跨域请求(复制)
很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了.近日在进行开 发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多 ...
- 【转】手动写一个Behavior Designer任务节点
http://blog.csdn.net/qq_33747722/article/details/53539532 自己手写一个类似于CanSeeObject.Seek等任务节点并不是一件难事 下面我 ...
- AngularJs之HelloWorld
<!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...
- web标准,可用性和可访问性
web标准,简单的说,是指html,css,JavaScript三者的分离. 网页由三部分组成:结构,表现和行为.对应的标准分为三方面: 1.结构化标准语言XHTML和XML2.表现标准语言主要包括c ...