POJ 1201 Intervals 差分约束
题目:http://poj.org/problem?id=1201
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #include <queue> 5 6 const int INF = 0x3f3f3f3f; 7 8 struct Edge 9 { 10 int v, w; 11 Edge(){}; 12 Edge(int v, int w) 13 { 14 this->v = v; 15 this->w = w; 16 } 17 }; 18 19 std::vector<Edge>map[50010]; 20 int dist[50010]; 21 bool inque[50010]; 22 23 void spfa(int s) 24 { 25 std::queue<int>q; 26 memset(inque, 0, sizeof(inque)); 27 dist[s] = 0; 28 q.push(s); 29 inque[s] = 1; 30 while(!q.empty()) 31 { 32 int u = q.front(); 33 q.pop(); 34 inque[u] = 0; 35 for(int i = 0; i < map[u].size(); i++) 36 { 37 int v = map[u][i].v; 38 if(dist[v] < dist[u] + map[u][i].w) 39 { 40 dist[v] = dist[u] + map[u][i].w; 41 if(!inque[v]) 42 { 43 q.push(v); 44 inque[v] = 1; 45 } 46 } 47 } 48 } 49 } 50 51 int main() 52 { 53 int n; 54 int x, y, z; 55 while(scanf("%d", &n) != EOF) 56 { 57 for(int i = 0; i <= 50001; i++) 58 { 59 map[i].clear(); 60 } 61 int low = INF, high = 0; 62 for(int i = 0; i < n; i++) 63 { 64 scanf("%d %d %d", &x, &y, &z); 65 map[x].push_back(Edge(y+1, z)); 66 if(low > x)low = x; 67 if(high < y)high = y; 68 } 69 for(int i = low; i <= high+1; i++) 70 { 71 map[0].push_back(Edge(i, 0)); 72 map[i].push_back(Edge(i+1, 0)); 73 map[i+1].push_back(Edge(i, -1)); 74 dist[i] = -INF; 75 } 76 spfa(0); 77 printf("%d\n", dist[high+1] - dist[low]); 78 } 79 return 0; 80 }