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 }