普通Dijkstra:

 1 void DijkstraPath(int v0,int vis[],int dist[],int path[])
 2 {
 3     int onePath[maxn];
 4     int d;
 5     int k;
 6     for(int i = 0;i < n;i++)
 7     {
 8         if( vis[i] && i != v0)
 9         {
10             cout<<"Path->";
11             d = 0;
12             onePath[d] = i;//添加路径上的终点
13             k = path[i];
14             if(k == -1)
15             {
16                 cout<<"No paht"<<endl;
17             }
18             else
19             {
20                 while(k != v0)
21                 {
22                     d++;
23                     onePath[d] = k;
24                     k = path[k];
25                 }
26                 d++;
27                 onePath[d] = v0;//添加起点
28                 cout<<"Start :"<<onePath[d];//起点
29                 for(int j = d - 1;j>=0;j--)
30                 {
31                     cout<<onePath[j]<<" ";
32                 }
33                 cout<<endl;
34             }
35         }
36     }
37 }
38 
39 void Dijkstra(int v0)
40 {
41     int dist[maxn];//距离数组,每个点到v0的直接距离
42     int path[maxn];//路径数组,记录最短路径上的前驱结点
43     int vis[maxn];
44     int u;//中间结点
45     memset(dist,0,sizeof(dist));
46     memset(path,0,sizeof(path));
47     memset(vis,0,sizeof(vis));
48     int mindist;
49     for(int i = 0;i < n;i++)
50     {
51         dist[i] = Graph[v0][i];
52         if(Graph[v0][i] < INF)
53         {
54             path[i] = v0;//开始与v0直连的点记录
55         }
56         else
57         {
58             path[i] = -1;
59         }
60     }
61     vis[v0] = 1;//开始时v0加入最短路中
62     path[v0] = 0;
63     for(int i = 0; i < n-1;i++)
64     {
65         mindist = INF;
66         for(int j = 0;j < n;j++)
67         {
68             if( !(vis[i]) && dist[j] < mindist)//找最短路
69             {
70                 mindist = dist[j];
71                 u = j;
72             }
73         }
74         vis[u] = 1;
75         for(int i = 0 ; i < n;i++)//路径更新
76         {
77             if( !(vis[i]))////考虑剩下未访问的边
78             {
79                 if( Graph[u][i] < INF && dist[i] > dist[u] + Graph[u][i] )
80                 //中间点的总路程比原来能直达的更短
81                 {
82                     dist[i] = dist[u] + Graph[u][i];
83                     path[i] = u;//更新前驱结点
84                 }
85             }
86         }
87     }
88     //DijkstraPath( v0, vis,dist,path);//输入最短路径
89 }
View Code

相关文章:

  • 2021-07-10
  • 2022-02-24
  • 2022-12-23
  • 2022-12-23
  • 2021-08-27
  • 2022-12-23
猜你喜欢
  • 2021-07-28
  • 2021-09-14
  • 2021-06-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-31
相关资源
相似解决方案