想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边。

  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]菜肴制作【拓扑排序】的更多相关文章

  1. BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...

  2. BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)

    题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...

  3. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  4. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

  5. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

  6. [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心

    <题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...

  7. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

  8. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  9. 【luoguP3243】[HNOI2015]菜肴制作--拓扑排序

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...

  10. [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序

    菜肴制作 bzoj-4010 HNOI-2015 题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前:(2)满足(1)的情况下编号为2的点尽量在前,以 ...

随机推荐

  1. jquery从tr获取td

    已知HTML:<tr id="row001"><td>001</td><td>张三</td></tr>JQU ...

  2. JSON 串 自定义解析字段

    我们有时候会只需要j一个很长的json串中的少数的key value ,这个时候我们不会特意去建立一个object 来映射属性,这个时候我们可以应用 gson的JsonParser  来解析json串 ...

  3. mplayer最全的命令

    前段时间做过qt内嵌mplayer的一个小程序,感觉mplayer还行不过不支持打开图片感觉有点无力.话不多说上代码: QString path="d:/1.mkv"; QWidg ...

  4. MVC工作流程

    1  浏览者 => 调用控制器,对它发出指令 2 控制器  => 按照指令选取一个合适的模型 3 模型    =>  按控制器指令取出相应的数据 4 控制器 =>  按指令选取 ...

  5. JQuery中一个简单的表单验证的实例

    html代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. Mysql 随机查询数据

    SELECT * FROM tablename ORDER BY RAND() LIMIT 10

  7. docker安装hadoop

    docker为hadoop的云化带来了极大便利,安装和应用也会更快更方便.进入正题: docker search hadoop 将会看到如下结果: INDEX NAME DESCRIPTION STA ...

  8. 页面加载完毕执行多个JS函数

    通常我们需要在打开页面时加载脚本,这些脚本必须在页面加载完毕后才可以执行,因为这时候DOM才完整,可以利用window.onload确保这一点,如:window.onload=firstFunctio ...

  9. Android CTS 测试总结【转】

    Android CTS 测试总结[转] 最近一直在做Android兼容性测试,根据Android官网给出的android-cts-manual 配置好了device后,开始测试. 首先配置软件环境: ...

  10. 继续几道经典的js题(局部和全局变量,对象等)

    1. //现有代码如下:var foo = 1;function main(){alert(foo);var foo = 2;alert(this.foo)this.foo = 3;}//1.请给出以 ...