bzoj4010: [HNOI2015]菜肴制作【拓扑排序】
想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边。
TLE 80:
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//*********************************** const int maxn = ; vector <int> Vx[maxn], Vy[maxn];
int src[maxn], lft[maxn]; int n, m;
int deg[maxn], tmp[maxn]; bool topo() {
static int que[maxn]; int qh(), qt();
rep(i, , n) if (!deg[i]) que[++qt] = i;
int cnt();
while (qh != qt) {
int x = que[++qh];
++cnt;
int len = (int) Vx[x].size();
for (int i = ; i < len; i++) {
if (--deg[Vx[x][i]] == ) que[++qt] = Vx[x][i];
}
}
return cnt == n;
} bool vis[maxn];
void bfs(int s) {
static int que[maxn]; int qh(), qt();
vis[que[++qt] = s] = ;
while (qh != qt) {
int x = que[++qh];
int len = (int) Vy[x].size();
for (int i = ; i < len; i++) {
if (!vis[Vy[x][i]]) {
vis[que[++qt] = Vy[x][i]] = ;
lft[Vy[x][i]] = ;
}
}
}
} void solve(int l, int r) {
if (l >= r) return;
int t, haha = inf;
rep(i, l, r) if (src[i] < haha) { t = i; haha = src[i]; }
rep(i, l, r) lft[src[i]] = vis[src[i]] = ;
bfs(src[t]);
int cur = l - ;
rep(i, l, r) if (src[i] != src[t] && lft[src[i]]) tmp[++cur] = src[i];
tmp[++cur] = src[t]; int mid = cur;
rep(i, l, r) if (src[i] != src[t] && !lft[src[i]]) tmp[++cur] = src[i];
memcpy(src + l, tmp + l, sizeof(int) * (r - l + ));
solve(l, mid - );
solve(mid + , r);
} int main() {
freopen("dishes.in", "r", stdin);
freopen("dishes.out", "w", stdout);
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
rep(i, , n) Vx[i].clear(), Vy[i].clear();
clr(deg);
rep(i, , m) {
int x, y; scanf("%d%d", &x, &y);
Vx[x].pb(y);
Vy[y].pb(x);
deg[y]++;
}
if (!topo()) { puts("Impossible!"); continue; }
rep(i, , n) src[i] = i;
solve(, n);
rep(i, , n) printf(i == n ? "%d\n" : "%d ", src[i]);
}
return ;
}
正解:
有依赖关系,我们建立反图,加入我们的到了这个反图的一个拓扑序,那么怎样对应到最优的答案呢?应该是尽量让编号小的出现在队列后方,所以最大字典序的拓扑排序即可。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//*********************************** const int maxn = ; vector <int> Vx[maxn], Vy[maxn];
priority_queue<int> Q;
int deg[maxn], ans[maxn], n, m; bool topo() {
rep(i, , n) if (!deg[i]) Q.push(i);
int cnt();
while (!Q.empty()) {
int x = Q.top(); Q.pop();
ans[++cnt] = x;
int len = (int) Vy[x].size();
for (int i = ; i < len; i++) {
if (--deg[Vy[x][i]] == ) Q.push(Vy[x][i]);
}
}
return cnt == n;
} int main() {
freopen("dishes.in", "r", stdin);
freopen("dishes.out", "w", stdout);
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
rep(i, , n) Vx[i].clear(), Vy[i].clear();
clr(deg);
rep(i, , m) {
int x, y; scanf("%d%d", &x, &y);
Vx[x].pb(y);
Vy[y].pb(x);
deg[x]++;
}
if (!topo()) puts("Impossible!");
else { drep(i, n, ) printf("%d ", ans[i]); puts(""); }
}
return ;
}
bzoj4010: [HNOI2015]菜肴制作【拓扑排序】的更多相关文章
- BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...
- BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...
- 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆
题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...
- [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心
<题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...
- 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...
- 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序
题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...
- 【luoguP3243】[HNOI2015]菜肴制作--拓扑排序
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
- [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
菜肴制作 bzoj-4010 HNOI-2015 题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前:(2)满足(1)的情况下编号为2的点尽量在前,以 ...
随机推荐
- JS-运动基础(一)
<title>无标题文档</title> <style> #div1{width:200px;height:200px; background:red; posit ...
- AndroidGradle --多渠道打包配置(转发)
需求 国内Android app发布一般会有多个渠道,为了跟踪发展情况,通常会为每一个渠道定制一个特别的apk. 一般友盟之类第三方统计的渠道ID定义如下,以wandoujia为例 <meta- ...
- Json.net对数据的解析
在官网下载Json.net文件后,解压完将Net20下面的DLL复制到Assets目录下. using UnityEngine; using System.Collections; using New ...
- 使用nginx简单实现负载均衡
只是简单使用nginx玩玩而已,知道能这么用,但是在实际项目中并没有实践过,在项目不大的时候用不到,但是对于理解负载均衡来说还是可以的. 利用虚拟机安装了三个centOS系统,然后顺便装了环境. 这里 ...
- OpenCV ——遍历图像方法
转自http://blog.csdn.net/daoqinglin/article/details/23628125 ; y < testImage->height; y++) { uch ...
- What is “Mock You” :Raise,callback,verify [转载]
http://www.cnblogs.com/wJiang/archive/2010/02/21/1670637.html Raise 如果你说会用Setup,那么Raise就更简单了.这里注意下它是 ...
- 鉴客 C# 抓取页面(带认证)
1. [代码][C#]代码 01 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(""); 02 re ...
- HDU 4287 Intelligent IME(字典树)
在我没用hash之前,一直TLE,字符串处理时间过长,用了hash之后一直CE,(请看下图)我自从经历我的字典树G++MLE,C++AC以后,一直天真的用C++,后来的CE就是因为这个,G++才支持这 ...
- 使用Pushlet将消息从服务器端推送到客户端
使用Pushlet来实现服务器端向客户端推送信息 1. 实现方式: 有两种实现方式: 1. 通过配置文件来实现定时的从服务器端向客户端推送信息 2. 通过API主动 ...
- 转:lr_eval_string,lr_save_string 和 sprintf 的使用
lr_eval_string,lr_save_string和 sprintf 函数使用介绍 一.lr_eval_string 使用介绍1.函数的主要作用:返回脚本中的一个参数当前的值,返回值类型:ch ...