hdu1384查分约束(最短路径)
来源:互联网 发布:慢走丝统盈编程 编辑:程序博客网 时间:2024/05/16 07:58
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int MAX = 0x7FFFFFFF;const int M = 500005;int head[M];struct node { int to; int value; int next;}edge[M];int n;int dist[M];int vist[M];int cnt;int maxn, minn;void init() { cnt = 0; maxn = -MAX; minn = MAX; memset(head, -1, sizeof(head)); // memset(dist, MAX, sizeof(dist)); memset(vist, 0, sizeof(vist));}void add(int v, int u, int d) { edge[cnt].to = u; edge[cnt].value = d; edge[cnt].next = head[v]; head[v] = cnt++;}void SPFA(int u) { for(int i = 0; i <= maxn; i++) { dist[i] = -500000; } queue<int>que; while(!que.empty()) que.pop(); dist[u] = 0; vist[u] = 1; que.push(u); while(!que.empty()) { u = que.front(); que.pop(); vist[u] = 0; for(int k = head[u]; k != -1; k = edge[k].next) { int v = edge[k].to; int d = edge[k].value; if(dist[v] < dist[u] + d) { // printf("%d %d %d %d\n", v, u, dist[v], dist[u]); dist[v] = dist[u] + d; if(vist[v] == 0) { vist[v] = 1; que.push(v); } } } } printf("%d\n", dist[maxn]);}int main(){ int x, y, d; while(scanf("%d", &n) != EOF) { init(); for(int i = 1; i <= n; i++) { scanf("%d%d%d", &x, &y, &d); minn = min(minn, x); maxn = max(y + 1, maxn); add(x, y+1, d); } for(int i = minn; i <= maxn; i++) { add(i, i+1, 0); add(i+1, i, -1); } SPFA(minn); } return 0;}