poj 1201

此题求的是最小值,用最长路;

用A-B>=x建边;

注意

1.[a,b]区间至少取c个,即b-(a-1)>=c;

a-1,如果a=0的话超界,所以所有的a,和b都加1;

2.对于i和i-1;

0<=i-(i-1)<=1;

3.可以把最小的a找出,节约时间。

//wa,re...了全是数组开小了!!,表示q一开始只开了十万;;;;

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,maxx,minn=1e9;
int dis[50005],q[1000005],vis[50005];
int h[50005],tov[200000],tow[200000],nex[200000],tp;
void add(int x,int y,int w)
{
	tp++;
	tow[tp]=w;
	tov[tp]=y;
	nex[tp]=h[x];
	h[x]=tp;
}
void spfa()
{
 for(int i=minn;i<=maxx;i++)
   dis[i]=-1;//赋初值啊!
	int tail=1,head=0;
	q[tail]=minn;
	dis[minn]=0;
	vis[minn]=1;
	while(head<tail)
	{
		head++;
		int x=q[head];
		for(int i=h[x];i;i=nex[i])
		{
			int v=tov[i];
			if(dis[v]<dis[x]+tow[i])
			{
				dis[v]=dis[x]+tow[i];
				if(vis[v]==0)
				{
					vis[v]=1;
					tail++;
					q[tail]=v;
				}
			}
		}
		vis[x]=0;
	}
	cout<<dis[maxx];
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x, y, w;
		scanf("%d%d%d",&x,&y,&w);
		add(x,y+1,w);
	   maxx=max(y+1,maxx);
	   minn=min(x,minn);
	}
	for(int i=minn+1;i<=maxx;i++)
	{
		add(i,i-1,-1);
		add(i-1,i,0);
	}
	spfa();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Bluelanzhan/article/details/80284996