HDU 4109 Instrction Arrangement 拓扑排序+dp 或者 差分约束
2012-04-23 21:43
369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4109
给定N个指令,其中有部分指令存在先后时间上的顺序,给定m个,x, y, z 即y必须在x执行完z秒后才执行,求 最少的时间。
首先根据拓扑排序找出入度为0点,处理,而对于有限制的一些点来说,dp[i] = max(dp[i],dp[j] + w) j 是i的临接点,w是i与j 的时间差。边表不是很熟,同时也练习了一下边表。。
View Code
给定N个指令,其中有部分指令存在先后时间上的顺序,给定m个,x, y, z 即y必须在x执行完z秒后才执行,求 最少的时间。
首先根据拓扑排序找出入度为0点,处理,而对于有限制的一些点来说,dp[i] = max(dp[i],dp[j] + w) j 是i的临接点,w是i与j 的时间差。边表不是很熟,同时也练习了一下边表。。
View Code
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #define N 1007 #define M 10002 using namespace std; struct node { int u,v; int w; }p[M]; int dis ; int n,m,len; void bellman() { int i,j; for (i = 1; i <= n + 1; ++i) { for (j = 0; j < len; ++j) { if (dis[p[j].v] > dis[p[j].u] + p[j].w) dis[p[j].v] = dis[p[j].u] + p[j].w; } } } int main() { //freopen("data.in","r",stdin); int i,x,y,z; while (~scanf("%d%d",&n,&m)) { for (i = 0; i <= n + 1; ++i) dis[i] = 0; for (i = 0; i < m; ++i) { scanf("%d%d%d",&x,&y,&z); p[i].u = x + 1; p[i].v = y + 1; p[i].w = -z; } len = i; for (i = 1; i <= n; ++i) { p[len].u = 0; p[len].v = i; p[len].w = 0; len++; p[len].u = i; p[len].v = n + 1; p[len].w = 0; len++; } bellman(); printf("%d\n",1 - dis[n + 1]); } return 0; }
相关文章推荐
- hdu 4109 Instrction Arrangement (差分约束)
- Instrction Arrangement (hdu 4109 差分约束)
- HDU 4109 Instrction Arrangement(差分约束)
- hdu 3592 差分约束 first bolld
- HDU 1384 Intervals 差分约束
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
- HDU 1384 (差分约束)
- HDU 1531 (差分约束)
- HDU 3592 World Exhibition (差分约束,spfa,水)
- HDU 1531 King(差分约束)
- (差分约束) hdu 1384
- HDU - 6252 - Subway Chasing(差分约束)
- hdu 4598 差分约束
- hdu 3592 差分约束 first bolld
- HDU 3592 World Exhibition 差分约束基础题
- hdu 1529 Cashier Employment(差分约束)
- HDU - 3440 House Man 【差分约束 + 最短路模型】
- HDU 1384 Intervals 差分约束
- hdu 3666 THE MATRIX PROBLEM (差分约束)
- HDU 3666 THE MATRIX PROBLEM(差分约束)