最短路SPFA

来源:互联网 发布:网络语斯什么意思 编辑:程序博客网 时间:2024/04/29 11:55

   SPFA 介绍见各网站,简单的基本代码如下

   代码:

#include<stdio.h>#include<string.h>#include<stdlib.h> #define  INF 0x3f3f3f3f #define MAX_VEREXT 1010int 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; }


0 0
原创粉丝点击