pku 3159 Candies

题意:

小孩A认为小孩B比自己多出的最多不会超过c个糖果,也就是 B - A <= c,正好符合差分约束方程,就是A到B的边权w(A, B) = c;用 SPFA + 栈 能过。

这题目,应该也算是差分约束的基础题吧,只不过用SPFA+队列实现超时了,无语呀

#include<iostream>
#define MAXINT 9999999
#define MAXN 30010
using namespace std;
int vis[MAXN],dis[MAXN],n,num,m;
int root[MAXN],stack[MAXN];
struct edge
{
	int u,w,next;
}e[MAXN*5];
void spfa()
{
	int top=0;
	for(int i=1;i<=n;i++)
	{
		dis[i]=MAXINT;
	}
	dis[1]=0;
	stack[++top]=1;
	vis[1]=1;
	while(top)
	{
		int t=stack[top--],tmp;
		vis[t]=0;
		for(int j=root[t];j!=-1;j=e[j].next)
		{
			tmp=e[j].u;
			if(dis[tmp]>dis[t]+e[j].w)
			{
				dis[tmp]=dis[t]+e[j].w;
				if(!vis[tmp])
				{
					vis[tmp]=1;
					stack[++top]=tmp;
				}
			}
		}
	}
}

int main()
{
	int a,b,c;
	cin>>n>>m;num=0;
	memset(root,-1,sizeof(root));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		e[num].u=b;
		e[num].w=c;
		e[num].next=root[a];
		root[a]=num++;
	}
	spfa();
	cout<<dis[n]<<endl;
}

		
posted @ 2011-08-14 13:50  枕边梦  阅读(170)  评论(0编辑  收藏  举报