SPFA 介绍见各网站,简单的基本代码如下
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAX_VEREXT 1010
int dis[MAX_VEREXT],map[MAX_VEREXT][MAX_VEREXT],visit[MAX_VEREXT],q[MAX_VEREXT],num[MAX_VEREXT];
int vex,arc;
void Init()
{
memset(dis,0x3f,sizeof(dis));
memset(map,0x3f,sizeof(map));
memset(visit,0,sizeof(visit));
memset(q,0,sizeof(q));
memset(num,0,sizeof(num));
}
int Spfa(int s)
{
int front,rear,i,pos;
front=rear=0;
q[rear]=s;
visit[s]=1;//入队
rear++;
num[s]++;
dis[s]=0;
while(front<rear)
{
pos=q[front];
front++;
visit[pos]=0;//出队
for(i=1;i<=vex;i++)
{
if(i==pos) continue;
if(dis[i]>dis[pos]+map[pos][i])
{
dis[i]=dis[pos]+map[pos][i];
if(!visit[i])//i未入队
{
visit[i]=1;//i入队
q[rear]=i;
rear++;
num[i]++;
if(num[i]==vex) //如果入队次数等于顶点数 说明有负环
return 0;
}
}
}
}
return 1;
}
int main()
{
int i;
int start,end,weight;
int flag;//判断是否有负环
while(scanf("%d%d",&vex,&arc)!=EOF)
{
Init();
for(i=1;i<=arc;i++)
{
scanf("%d%d%d",&start,&end,&weight);
if(map[start][end]>weight) map[start][end]=map[end][start]=weight;
}
flag=Spfa(1);//默认编号1...n,从1出发
if(flag==0) printf("有付环\n");
else
for(i=2;i<=vex;i++)
printf("%d ",dis[i]); //1到各点的最短路
printf("\n");
}
return 0;
}