原文:http://blog.acmj1991.com/?p=713
题意:在区间[1,50000]范围内,给定你一些区间以及区间内整数点的个数,问在[1,50000]区间内最小整数点的个数
思路:差分约束系统
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxN 50010
#define MAX 0x0fffff
int num;
int dis[maxN],vist[maxN],head[maxN];
struct point{
int v,w,next;
}po[maxN*20];
void add(int u,int v,int w){
po[num].v=v,po[num].w=w;
po[num].next=head[u],head[u]=num++;
}
int spfa(int st,int en)
{
int he=0,tail=0,qu[maxN*10];
for(int i=st;i<=en;i++)
dis[i]=-MAX;
dis[st]=0;
vist[st]=1;
qu[tail++]=st;
while(he<tail){
int u=qu[he++];
vist[u]=0;
for(int i=head[u];i!=-1;i=po[i].next)
{
int v=po[i].v;
if(dis[v]<dis[u]+po[i].w){
dis[v]=dis[u]+po[i].w;
if(!vist[v]){
vist[v]=1;
qu[tail++]=v;
}
}
}
}
return dis[en];
}
int main()
{
//freopen("1.txt","r",stdin);
int u,v,w,n,st=maxN,en=0;
memset(head,-1,sizeof(head));
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v+1,w);
st=min(st,u);
en=max(en,v+1);
}
for(int i=st;i<=en;i++){
add(i,i+1,0);
add(i+1,i,-1);
}
printf("%d\n",spfa(st,en));
}