拓扑排序 最大字典序+优先队列 BZOJ 4010
http://www.lydsy.com/JudgeOnline/problem.php?id=4010
4010: [HNOI2015]菜肴制作
Time Limit: 5 Sec Memory Limit: 512 MB
Submit: 1627 Solved: 803
[Submit][Status][Discuss]
Description
知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
Input
第一行是一个正整数D,表示数据组数。
Output
输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
Sample Input
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
Sample Output
Impossible!
1 5 2 4 3
HINT
【样例解释】
思路:其实我一开始是想正着推的,然后刚开始就打算建立一张图,然后利用stack来解决这个问题。然后发现怎么也出不来,蓝瘦香菇。
(看了题解以后)
mdzz,一个傻逼题?
根据这道题目的条件,数字小的要尽量在前面,所以这样很容易理解成最小字典序,但是并不是这样的,例如样例3就是一个反例,即最小的在前面,但是最小的所要满足的条件的那个东西的数值并不一定小。所以是失败的。
那么我们换一个方法思考,因为我们不能满足字典序最小,但是,根据这个条件,最大的放在后面一定是优的!所以我们反过来建图,然后把in[u] = 0的放到优先队列里面去就好了。
(其实这个复杂度,我觉得最坏的情况应该是n*n/4,可能是数据水了= =)
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
int n, m;
vector<int> G[maxn];
int in[maxn];
vector<int> ans; bool solve(){
priority_queue<int> que;
ans.clear();
for (int i = ; i <= n; i++){
if (in[i] == ) que.push(i);
}
while (!que.empty()){
int u = que.top(); que.pop();
ans.push_back(u);
for (int i = ; i < G[u].size(); i++){
int v = G[u][i]; in[v]--;
if (in[v] == ) que.push(v);
}
}
//printf("size = %d\n", ans.size());
return ans.size() == n;
} int main(){
int t; cin >> t;
while (t--){
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) G[i].clear(), in[i] = ;
for (int i = ; i <= m; i++){
int u, v; scanf("%d%d", &u, &v);
G[v].pb(u); in[u]++;
}
if (!solve()) puts("Impossible!");
else {
reverse(ALL(ans));
for (int i = ; i < ans.size(); i++){
printf("%d ", ans[i]);
}
cout << endl;
}
}
return ;
}
拓扑排序 最大字典序+优先队列 BZOJ 4010的更多相关文章
- hdu 4857 逆向建图+拓扑排序 ***
题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...
- hdu-5695 Gym Class(贪心+拓扑排序)
题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【BZOJ5288】[HNOI2018]游戏(拓扑排序)
[BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...
- POJ3687拓扑排序+贪心
题意: 给你n个求,他们的重量是1-n(并不是说1号求的重量是1...),然后给你m组关系a,b,表示a的重量小于b的重量,然后让你输出满足要求的前提下每个球的重量,要求字典序最小. 思路 ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- HDU 4857 (反向拓扑排序 + 优先队列)
题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 拓扑排序+不是字典序的优先级排列(POJ3687+HDU4857)
一.前言 在过去的一周里结束了CCSP的比赛,其中有一道题卡了我9个小时,各种调错都没法完整的调处来这题,于是痛下决心开始补题,这个是计划的一部分.事实上,基于错误的理解我写了若干发拓扑排序+字典序的 ...
- hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
随机推荐
- 王者荣耀交流协会-Alpha发布用户使用报告
用户数量:10人 姓名如下(包括化名):张小斌.王瑞瑞.蛋蛋.小美.晨曦.小丽.张利刚.小闫.小谢.小崔 寻找的用户多为王者荣耀交流协会成员的同学,对管理时间有着强烈的需求,也对PSP Daily软件 ...
- “Hello World!”团队第三周召开的第二次会议
今天是我们团队“Hello World!”团队第三周召开的第二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 ...
- c# 读取blob数据
Stream stream = new MemoryStream(data); BinaryReader r = new BinaryReader(stream); int iRawImageWidt ...
- 模拟登入教务处(header)
import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import ...
- Access连接数据源配置(新手必知)
今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...
- 元素相加交换另解&puts的一个用法
#include<iostream> using namespace std; int main(){ int a,b; cin>>a>>b; a^=b; b^=a ...
- 解决sublime install package连不上的问题
下载文件 百度网盘:https://pan.baidu.com/s/1Z-11d4btZJyx5zA7uzNi8Q 修改配置文件 转载请注明博客出处:http://www.cnblogs.com/cj ...
- 【C++】new和delete表达式与内存管理
new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...
- 第112天:javascript中函数预解析和执行阶段
关于javascript中的函数: 1.预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 2.执行 :从上到下执行,但有例外(setTimeout,setInterval,aja ...
- BZOJ 2957 楼房重建(线段树区间合并)
一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...