Intervals (spfa+差分约束)

http://acm.hdu.edu.cn/showproblem.php?pid=1384

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cstdio>
 5 using namespace std;
 6 const int N = 50000+10;
 7 const int INF = 1<<27;
 8 int n,max_n,min_n,cnt;
 9 bool vis[N];
10 int dis[N];
11 int root[N];
12 struct node{
13     int v,next,dis;
14 }eg[4*N];
15 void add(int u,int v,int w)
16 {
17     eg[cnt].v=v;
18     eg[cnt].next=root[u];
19     eg[cnt].dis=w;
20     root[u]=cnt++;
21 }
22 bool relax(int u,int v,int w)
23 {
24     if(dis[v]<dis[u]+w)
25     {
26         dis[v]=dis[u]+w;
27         return 1;
28     }
29     return 0;
30 }
31 void spfa()
32 {
33     int i;
34     for(i=min_n;i<=max_n;i++)
35     {
36         dis[i]=-INF;vis[i]=0;
37     }
38     dis[min_n]=0;vis[min_n]=1;
39     queue<int> q;
40     q.push(min_n);
41     while(!q.empty())
42     {
43         int u=q.front();
44         q.pop();vis[u]=0;
45         for(i=root[u];i!=-1;i=eg[i].next)
46         {
47             int v=eg[i].v;
48             int d=eg[i].dis;
49             if(relax(u,v,d)&&!vis[v])
50             {
51                 vis[v]=1;
52                 q.push(v);
53             }
54         }
55     }
56 }
57 int main()
58 {
59     int u,v,w,i;
60     while(cin>>n)
61     {
62         max_n=-INF;min_n=INF;cnt=0;
63         memset(root,-1,sizeof(root));
64         for(i=0;i<n;i++)
65         {
66             scanf("%d%d%d",&u,&v,&w);
67             u++;v++;
68             max_n=max(max_n,v);
69             min_n=min(min_n,u-1);
70             add(u-1,v,w);
71         }
72         for(i=min_n;i<=max_n;i++)//0<=dis[i]-dis[i-1]<=1
73         {
74             add(i,i-1,-1);
75             add(i-1,i,0);
76         }
77         spfa();
78         cout<<dis[max_n]<<endl;
79     }
80     return 0;
81 }
原文地址:https://www.cnblogs.com/qijinbiao/p/2591134.html