SPFA

求最短路径 SPFA

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring> 
 4 using namespace std;
 5 
 6 const int MAXN=1001;
 7 const int INF=999999;
 8 
 9 int map[MAXN][MAXN];//记录权值 
10 int path[MAXN];//记录路径 
11 int dis[MAXN];//记录最短值 
12 int team[MAXN];//队列 
13 bool visit[MAXN];//是否在队列中 
14 int n,m,u,v,len,a,e;
15 
16 void sc(int u)//求最短路径 
17 {
18     int head=0,tail=1,p;
19     team[head]=u;//队列的第一个为起点 
20     path[u]=u;//路径为起点 
21     visit[u]=true;//标记为已在队列中 
22     dis[u]=0;//起点的权值为0 
23     while(head<tail)
24     {
25         p=team[head];
26         for(int i=1;i<=n;i++)
27         {
28             if(dis[i]>dis[p]+map[p][i])//松弛
29             {
30                 dis[i]=dis[p]+map[p][i]; 
31                 path[i]=p;
32                 if(!visit[i])//如果不在队列中,重新入队 
33                 {
34                     team[tail++]=i;
35                     visit[i]=true;//标记已为在队列中 
36                 }
37             }
38         }
39         visit[p]=false;//将p标记为没在队列中 
40         head++;//head后移,head所指向的元素依次出对 
41     }
42     cout<<dis[e]<<endl;//输出最短路径的长度 
43 }
44 
45 void out(int b,int o)//输出最短路径的路径 
46 {
47     int que[MAXN];//记录最短路径的路径
48     int tot=1;
49     que[tot]=o;//第一个为起点 
50     tot++;
51     int temp=path[o];
52     while(temp!=b)//将路径依次记录在que数组中 
53     {
54         que[tot]=temp; 
55         tot++;
56         temp=path[temp];
57     }
58     que[tot]=b;
59     for(int i=tot;i>=1;i--)//输出路径 
60     {
61         if(i!=1)//避免最后一个路径带有--> 
62         cout<<que[i]<<"-->";
63         else 
64         cout<<que[i];
65     }
66 }
67 
68 int  main()
69 {
70     cin>>n>>m;
71     for(int i=1;i<=n;i++)//初始化 
72       for(int j=1;j<=n;j++)
73         map[i][j]=INF;
74     for(int i=1;i<=m;i++){
75         cin>>u>>v>>len;
76         map[u][v]=len;
77     }
78     for(int i=1;i<=n;i++)
79     dis[i]=INF;
80     memset(visit,false,sizeof(visit));
81     memset(team,0,sizeof(team));
82     cin>>a>>e;//输入查找的起点和终点 
83     sc(a);
84     out(a,e);
85     return 0;
86 }

 

posted @ 2017-04-10 16:53  橘生淮南终洛枳  阅读(153)  评论(0编辑  收藏  举报