poj3159(spfa+栈)

             题目链接:http://poj.org/problem?id=3159

              题目意思:flymouse是班里的班长,她(假设是女的哈)从老师那里拿来了一袋糖果,要发给班里的同学。好吧,flymouse与snoopy平时在班里是死对头,这下子,他(假设是男的啦)是要倒霉了。由于班里的同学都喜欢吃糖,但是每个同学都要说出一个条件,那就是A认为B同学的糖不能比他的多C,flymouse在发糖的时候要满足所有同学的要求,现在问,flymouse如何给每个同学发糖,最后能使自己的糖的数量比snoopy多的最多,输出这个数量,假设同学的编号为1-n,其中snoopy为1号,flymouse为n号!

 

         看了题目的discuss,大家都在议论用spfa+队列实现的话,会造成超时的。好吧,开始的时候我用链表实现邻接表,然后用spfa+栈进行,交上去,结果还是超时,到网上查了查,使用数组模拟生成邻接表,然后再提交,AC了,500+ms。(疑惑:链表实现为何会超时呢,有知道的朋友,谢谢答惑)

 

代码:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define INF 100000000
typedef struct EdgeNode{
	int v;
	int w;
}EdgeNode;
EdgeNode edge[150005];
int node[30005],next[150005];
int dis[30005],inS[30005];
int S[30005],top;
int n,m;
void spfa()
{
    int i,x;
    int r;
	top=0;
	memset(inS,0,sizeof(inS));
	for(i=1;i<=n;i++)
		dis[i]=INF;
	dis[1]=0;
	S[++top]=1;
	inS[1]=1;
	while(top)
	{
       x=S[top];
	   top--;
	   inS[x]=0;
	   for(r=node[x];r!=-1;r=next[r])
	   {
		   if(dis[edge[r].v]>dis[x]+edge[r].w)
		   {
			   dis[edge[r].v]=dis[x]+edge[r].w;
		     if(!inS[edge[r].v])
			 {
			    S[++top]=edge[r].v;
			    inS[edge[r].v]=1;
			 }
		   }
	   }
	}
} 
void main()
{
	int i=1;
	int a,b,c;

	scanf("%d%d",&n,&m);
    memset(node,-1,sizeof(node));
	while(m--)
	{
		scanf("%d%d%d",&a,&b,&c);
        edge[i].v=b;
		edge[i].w=c;
		next[i]=node[a];
		node[a]=i++;
	}
   spfa();
   printf("%d\n",dis[n]);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值