一道十分基本的最短路。
貌似我写最短路写出了思维定势,初始化竟然错了——因为这道题的权值在结点上,不在边上。
不管怎么样,一道水题写成这个样子是不应该的==!
/*
* 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;
}
本文深入探讨了最短路算法的基本概念,指出了一位开发者在实现过程中遇到的思维误区,并详细解释了正确的初始化方法。通过实例分析,强调了理解题目细节对于算法正确实现的重要性。
258

被折叠的 条评论
为什么被折叠?



