HDU-1224 最短路 SPFA

本文深入探讨了最短路算法的基本概念,指出了一位开发者在实现过程中遇到的思维误区,并详细解释了正确的初始化方法。通过实例分析,强调了理解题目细节对于算法正确实现的重要性。

一道十分基本的最短路。

貌似我写最短路写出了思维定势,初始化竟然错了——因为这道题的权值在结点上,不在边上。

不管怎么样,一道水题写成这个样子是不应该的==!

/*
 * hdu-1224
 * mike-w
 * 2012-4-7
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 128
#define Q_SIZE MAX_SIZE
#define INF (1<<30)

int T,N,M;
int f[MAX_SIZE][MAX_SIZE];
int que[Q_SIZE],qhead,qtail,qlen;
int inq[MAX_SIZE],dst[MAX_SIZE],pi[MAX_SIZE];
int ff[MAX_SIZE];

int enque(int e)
{
	if(qlen==Q_SIZE)
		return -1;
	qlen++;
	que[qtail]=e;
	qtail=(qtail+1)%Q_SIZE;
	return 0;
}

int deque(int *e)
{
	if(qlen==0)
		return -1;
	qlen--;
	*e=que[qhead];
	qhead=(qhead+1)%Q_SIZE;
	return 0;
}

int disp(int e)
{
	if(pi[e]==e)
		printf("%d",e);
	else
	{
		disp(pi[e]);
		printf("->%d",e);
	}
	return 0;
}

int spfa(void)
{
	int i,x;
	for(i=1;i<=N+1;i++)
		inq[i]=0,dst[i]=-INF,pi[i]=i;
	qhead=qtail=qlen=0;
	dst[1]=0;
	pi[1]=1;
	inq[1]=1;
	enque(1);
	while(deque(&x)!=-1)
	{
		inq[x]=0;
		for(i=1;i<=N+1;i++)
		{
			if(f[x][i] && dst[x]+ff[i]>dst[i])
			{
				dst[i]=dst[x]+ff[i];
				pi[i]=x;
				if(!inq[i])
					enque(i),inq[i]=1;
			}
		}
	}
	printf("points : %d\n",dst[N+1]);
	printf("circuit : ");
	disp(pi[N+1]);
	printf("->1\n");
	return 0;
}


int main(void)
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
	scanf("%d",&T);
	int ccase=1;
	int i,j,e1,e2;
	for(ccase=1;ccase<=T;ccase++)
	{
		printf("CASE %d#\n",ccase);
		for(i=1;i<=N+1;i++)
			for(j=1;j<=N+1;j++)
				f[i][j]=0;
		scanf("%d",&N);
		for(i=1;i<=N;i++)
			scanf("%d",ff+i);
		ff[N+1]=0;
		scanf("%d",&M);
		for(i=1;i<=M;i++)
			scanf("%d%d",&e1,&e2),f[e1][e2]=1;
		spfa();
		if(ccase<T)
			putchar('\n');
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值