Differential constraint system.
Find the minimum value and use the longest way to solve it.
#include <cstdio>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<algorithm>using namespacestd;Const intmaxn=50010;Const intinf=0x7fffffff;structabc{intStartt; intendd; intCostt;} node[4*Maxn];vector<abc>LJB[MAXN];inttott,n,zd,zx;intDIST[MAXN],FF[MAXN],SUMM[MAXN];voidSPFA () {Queue<int>p; while(!Q.empty ()) Q.pop (); inti; for(I=ZX; i<=zd+1; i++) dist[i]=-INF; memset (FF,0,sizeof(FF)); memset (Summ,0,sizeof(Summ)); DIST[ZX]=0; FF[ZX]=1; Q.push (ZX); while(!Q.empty ()) { intHh=Q.front (); Q.pop (); SUMM[HH]++; FF[HH]=0; for(i=0; I<ljb[hh].size (); i++) {ABC Noww; Noww=Ljb[hh][i]; if(dist[hh]+noww.costt>DIST[NOWW.ENDD]) {DIST[NOWW.ENDD]=dist[hh]+Noww.costt; if(ff[noww.endd]==0) {FF[NOWW.ENDD]=1; Q.push (NOWW.ENDD); } } } }}intMain () {intI,u,v,c; while(~SCANF ("%d",&N)) { for(i=0; i<maxn; i++) ljb[i].clear (); ZD=-INF; ZX=INF; Tott=1; for(i=0; i<n; i++) {scanf ("%d%d%d",&u,&v,&c); if(V>ZD) zd=v; if(U<ZX) zx=u; Node[tott].startt=u; Node[tott].endd=v+1; Node[tott].costt=C; Ljb[u].push_back (Node[tott]); Tott++; } for(I=ZX; i<=zd; i++) {Node[tott].startt=i+1; Node[tott].endd=i; Node[tott].costt=-1; Ljb[i+1].push_back (Node[tott]); Tott++; Node[tott].startt=i; Node[tott].endd=i+1; Node[tott].costt=0; Ljb[i].push_back (Node[tott]); Tott++; } SPFA (); printf ("%d\n", dist[zd+1]-DIST[ZX]); } return 0;}
HDU 1384 intervals