【POJ1201】Intervals-差分约束系统+单源最长路
测试地址:Intervals
题目大意:有一个集合,给定
做法:本题需要用到差分约束系统和单源最长路。
题目中给了形如
等等,好像有什么东西漏了。注意到
有的同学可能会问了,会不会存在无解的情况?可以证明,根据题目的数据范围,建出来的图是不会出现正环的,也就是一定有解,所以不用担心。
以下是本人代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define inf 1000000000
using namespace std;
int n,maxlen=0,s,first[50010]={0},tot=0;
int dis[50010];
bool vis[50010]={0};
struct edge {int v,d,next;} e[300010];
queue <int> Q;
void insert(int a,int b,int d)
{
e[++tot].v=b;
e[tot].d=d;
e[tot].next=first[a];
first[a]=tot;
}
void spfa(int s)
{
Q.push(s);
vis[s]=1;dis[s]=0;
for(int i=0;i<=maxlen+1;i++) dis[i]=-inf;
while(!Q.empty())
{
int v=Q.front();Q.pop();
for(int i=first[v];i;i=e[i].next)
if (dis[e[i].v]<dis[v]+e[i].d)
{
dis[e[i].v]=dis[v]+e[i].d;
if (!vis[e[i].v]) Q.push(e[i].v);
}
vis[v]=0;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
maxlen=max(maxlen,b);
insert(a,b+1,c);
}
s=maxlen+2;
for(int i=0;i<=maxlen;i++)
{
insert(s,i+1,0);
if (i>0)
{
insert(i+1,i,-1);
insert(i,i+1,0);
}
}
spfa(s);
printf("%d",dis[maxlen+1]);
return 0;
}