差分约束系统,用Spfa写的。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=1<<29;
const int maxn=5e4+100;
const int maxm=4*maxn;
int e,head[maxn],pnt[maxm],cost[maxm],nxt[maxm],dist[maxn];
int n;
bool vis[maxn];
queue<int> q;
void AddEdge(int u,int v,int c)
{
pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++;
}
int Spfa(int st,int des)
{
for(int i=0;i<=des;i++)
dist[i]=-inf;
dist[st]=0;
q.push(st);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=nxt[i])
if(dist[pnt[i]]<dist[u]+cost[i])
{
dist[pnt[i]]=dist[u]+cost[i];
if(!vis[pnt[i]])
{
vis[pnt[i]]=1;
q.push(pnt[i]);
}
}
}
return max(1,dist[des]);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
e=0;
memset(head,-1,sizeof(head));
int st=inf,des=0;
for(int i=0;i<n;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
AddEdge(u,v+1,c);
st=min(st,u);
des=max(des,v+1);
}
for(int i=st;i<des;i++)
{
AddEdge(i,i+1,0);
AddEdge(i+1,i,-1);
}
printf("%d\n",Spfa(st,des));
}
return 0;
}