差分约束系统:
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;
}