差分约束系统:
1.输入的边
2.每个相邻点的边
3.每个点与源点的边
#include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #define INF 0x7fffffff #define maxn 50005 using namespace std; struct node { int v,c; }; vector<node>g[maxn]; int t; int s,e; int sum[maxn]; int dis[maxn],vis[maxn]; void add(int u,int v,int c) { node p; p.v=v,p.c=c; g[u].push_back(p); } bool spfa() { int u,v; queue<int>q; for(int i=s; i<=e; i++) dis[i]=-INF; memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum)); dis[s-1]=0; vis[s-1]=1; q.push(s-1); while(!q.empty()) { u=q.front(),q.pop(); for(int i=0; i<g[u].size(); i++) { int v=g[u][i].v,c=g[u][i].c; if(dis[v]<dis[u]+c) { dis[v]=dis[u]+c; //printf("%d\n",dis[v]); if(!vis[v]) { vis[v]=1; sum[v]++; if(sum[v]>(e-s+1)) return 0; q.push(v); } } } vis[u]=0; } return 1; } int main() { int a,b,c; while(scanf("%d",&t)!=EOF) { s=INF,e=-1; for(int i=0;i<maxn;i++) { g[i].clear(); } while(t--) { scanf("%d%d%d",&a,&b,&c); add(a-1,b,c); if(e<b) e=b; if(s>a) s=a; } for(int i=s; i<=e; i++) { add(i-1,i,0); add(i,i-1,-1); } for(int i=s; i<=e; i++) { add(s-1,i,0); } spfa(); //printf("%d %d\n",s,e); //printf("%d %d\n",dis[e],dis[s-1]); printf("%d\n",dis[e]-dis[s-1]); } return 0; }