利用相互关系进行约束,求最长路
/* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #define INF 1E9 using namespace std; struct edge { int len,nn; }; int ss,ee,dis[50005]; queue<int> q; bool in[50005]; vector<edge> map[50005]; int spfa() { int i,now,k,next,t; while(!q.empty())q.pop(); memset(in,0,sizeof(in)); for(i=ss; i<=ee; i++) dis[i]=-INF; in[ss]=1; dis[ss]=0; q.push(ss); while(!q.empty()) { now=q.front(); q.pop(); in[now]=0; k=map[now].size(); for(i=0; i<k; i++) { next=map[now][i].nn; if(dis[next]>=(t=dis[now]+map[now][i].len))continue; dis[next]=t; if(in[next])continue; q.push(next); in[next]=1; } } return dis[ee]; } int main() { int i,n,a,b,c; edge temp; while(~scanf("%d",&n)) { for(i=0; i<50005; i++)map[i].clear(); ss=INF; ee=-1; while(n--) { scanf("%d%d%d",&a,&b,&c); b++; if(a<ss)ss=a; if(b>ee)ee=b; temp.len=c; temp.nn=b; map[a].push_back(temp); } for(i=ss; i<=ee; i++) { temp.len=0; temp.nn=i+1; map[i].push_back(temp); temp.len=-1; temp.nn=i; map[i+1].push_back(temp); } printf("%d\n",spfa()); } return 0; }