poj 1201 差分约束+spfa

非常经典的差分约束系统的建模。求最小值需要转化为求最长路。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 const int INF = 99999999;
 8 const int N = 50002;
 9 const int M = 200000;
10 int head[N];
11 int dist[N];
12 bool visit[N];
13 int n, m, e;
14 int maxn, minn;
15 
16 struct Edge
17 {
18     int v, next, w;
19 } edge[M];
20 
21 void addEdge( int u, int v, int w )
22 {
23     edge[e].v = v;
24     edge[e].w = w;
25     edge[e].next = head[u];
26     head[u] = e++;
27 }
28 
29 void spfa( int s )
30 {
31     for ( int i = minn; i <= maxn; i++ )
32     {
33         dist[i] = -INF;
34         visit[i] = false;
35     }
36     dist[s] = 0;
37     visit[s] = true;
38     int q[N], top = 0;
39     q[top++] = s;
40     while ( top )
41     {
42         int u = q[--top];
43         visit[u] = false;
44         for ( int j = head[u]; j != -1; j = edge[j].next )
45         {
46             int v = edge[j].v, w = edge[j].w;
47             if ( dist[v] < dist[u] + w )
48             {
49                 dist[v] = dist[u] + w;
50                 if ( !visit[v] )
51                 {
52                     q[top++] = v;
53                     visit[v] = true;
54                 }
55             }
56         }
57     }
58 }
59 
60 int main ()
61 {
62     while ( scanf("%d", &n) != EOF )
63     {
64         e = 0;
65         memset( head, -1, sizeof(head) );
66         minn = INF, maxn = -INF;
67         for ( int i = 1; i <= n; i++ )
68         {
69             int a, b, c;
70             scanf("%d%d%d", &a, &b, &c);
71             addEdge( a, b + 1, c );
72             maxn = max( maxn, b + 1 );
73             minn = min( minn, a );
74         }
75         for ( int i = minn + 1; i <= maxn; i++ )
76         {
77             addEdge( i, i - 1, -1 );
78             addEdge( i - 1, i, 0 );
79         }
80         spfa(minn);
81         printf("%d\n", dist[maxn]);
82     }
83     return 0;
84 }

 

转载于:https://www.cnblogs.com/huoxiayu/p/4766812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值