#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<set> #include <fstream> using namespace std; const int maxn=50005; int n; int head[maxn]; int len; int dis[maxn]; int vis[maxn]; struct Node { int to;int val;int next; }e[11111111]; void add(int from,int to,int val) { e[len].to=to; e[len].val=val; e[len].next=head[from]; head[from]=len++; } const int INF=0xfffffff; int Max; int cnt[maxn]; int spfa(int x) { for(int i=0;i<=Max;i++) dis[i]=INF; memset(vis,0,sizeof(vis)); dis[x]=0;vis[x]=1; queue<int> q; q.push(x); while(!q.empty()){ int cur=q.front();q.pop();vis[cur]=0; for(int i=head[cur];i!=-1;i=e[i].next){ int cc=e[i].to; if(dis[cc]>dis[cur]+e[i].val){ dis[cc]=dis[cur]+e[i].val; if(!vis[cc]){ vis[cc]=1;cnt[cc]++;if(cnt[cc]>n) return 0; q.push(cc); } } } } return 1; } int main() { while(cin>>n){ Max=0; int len=0;memset(head,-1,sizeof(head)); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++){ int a;int b;int c;cin>>a>>b>>c; if(b>Max) Max=b;a--;add(b,a,-c); } for(int i=0;i<=Max-1;i++) add(i,i+1,1); for(int i=1;i<=Max;i++) add(i,i-1,0); int t=spfa(Max); if(t) cout<<-dis[0]<<endl; } return 0; }
原文:http://www.cnblogs.com/yigexigua/p/3849540.html