HDU4109 Instrction Arrangement
Posted smatrchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU4109 Instrction Arrangement相关的知识,希望对你有一定的参考价值。
关键路径入门题目
拓扑排序 每次选入度为0的点
关键路径 每个点称为活动 只有当一个活动(也就是点)的入度为0 才能做这个活动
假设一个点入度为1 被一个点x 一条弧w指着 要等这个点先等x昨晚 然后再等w的时间才能 才能执行这个点的活动 显然这个过程所需时间 就是 x+w
以此类推 一个点被n个点分别用n条弧指着 他的最早开始执行时间是 X[i] + W[i]的最大值 把全部指向他的活动+弧做完了才能开始
实现 在拓扑的排序的时候 取出节点now 每次边指向的节点都判断 他的开始时间finish最迟是什么时候
最后finish中最大的就是完成所有活动所需的时间
http://acm.hdu.edu.cn/showproblem.php?pid=4109
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; struct node int to,value; ; vector<node> nxt[1005]; //向量+结构体 邻接表 int in_degree[1005]; //节点的入度 int finish[1005]; //节点的开始时间 int m, n; void topo() queue <int> q; for (int i = 0; i < n; i++) if (in_degree[i] == 0) finish[i] = 1; q.push(i); while (!q.empty()) int now = q.front(); q.pop(); for (int i = 0; i < nxt[now].size(); i++) int to = nxt[now][i].to; int v = nxt[now][i].value; in_degree[to]--; finish[to] = max(finish[to], finish[now] + v); if (in_degree[to] == 0) q.push(to); int tp = 1; for (int i = 0; i < n; i++) tp = max(tp, finish[i]); printf("%d\n", tp); int main() while (cin >> n >> m) fill(finish, finish + 1005, 0); fill(in_degree, in_degree + 1005, 0); for(int i = 0; i < n; i++) nxt[i].clear(); for (int i = 0; i < m; i++) int a, b, c; scanf("%d %d %d", &a, &b, &c); in_degree[b]++; node no; no.to = b; no.value = c; nxt[a].push_back(no); topo(); return 0;
以上是关于HDU4109 Instrction Arrangement的主要内容,如果未能解决你的问题,请参考以下文章