一、代码
#include <iostream>
using namespace std
;
#define Maxnum 100
#define Infinity 65535
typedef int Vertex
;
typedef int ARType
;
typedef char* Info
;
typedef struct {
ARType adj
=Infinity
;
Info info
;
}Arcs
[Maxnum
][Maxnum
];
typedef struct {
Arcs arcs
;
Vertex vexs
[Maxnum
];
int arcnum
,vexnum
;
}MGraph
;
void CreateMGraph(MGraph
&G
)
{
cin
>>G
.vexnum
>>G
.arcnum
;
for (int i
= 0; i
< G
.vexnum
; ++i
) cin
>>G
.vexs
[i
];
int posx
,posy
,weight
;
for (int i
= 0; i
< G
.arcnum
; ++i
) {
cin
>>posx
>>posy
>>weight
;
G
.arcs
[posx
][posy
].adj
=weight
;
}
}
typedef int PathMatrix
[Maxnum
][Maxnum
];
typedef int ShortPathTable
[Maxnum
];
void ShortestPath_Dijkstra(MGraph G
,int v0
,PathMatrix
&P
,ShortPathTable
&D
)
{
bool final
[Maxnum
];
int v
;
for (int i
= 0; i
< G
.vexnum
; ++i
) {
final
[i
]= false;
D
[i
]=G
.arcs
[v0
][i
].adj
;
for (int j
= 0; j
< G
.vexnum
; ++j
) P
[i
][j
]=0;
if(D
[i
]<Infinity
)
{
P
[i
][v0
]=1;P
[i
][i
]=1;
}
}
final
[v0
]= true;D
[v0
]=0;
for (int i
= 1; i
< G
.vexnum
; ++i
) {
int min
=Infinity
;
for (int j
= 0; j
< G
.vexnum
; ++j
) {
if (!final
[j
]&&(D
[j
]<min
)){
min
=D
[j
];v
=j
;
}
}
final
[v
]=true;
for (int j
= 0; j
< G
.vexnum
; ++j
) {
if (!final
[j
]&&(min
+G
.arcs
[v
][j
].adj
<D
[j
]))
{
D
[j
]=min
+G
.arcs
[v
][j
].adj
;
for (int k
= 0; k
< G
.vexnum
; ++k
) P
[j
][k
]=P
[v
][k
];
P
[j
][j
]= 1;
}
}
}
}
int main()
{
MGraph G
;
CreateMGraph(G
);
ShortPathTable D
;
PathMatrix P
;
ShortestPath_Dijkstra(G
,0,P
,D
);
for (int i
= 0; i
< G
.vexnum
; ++i
) {
cout
<<i
<<": ";
for (int j
= 0; j
< G
.vexnum
&&j
!=i
; ++j
)
if (P
[i
][j
]==1) cout
<<j
<<"->";
cout
<<i
<<" ";
cout
<<"shortest path: "<<D
[i
]<<endl
;
}
return 0;
}
输入及输出:
二、过程
总结
dijkstra算法与prim算法非常相似: prim算法是不断寻找U中与集合S之间距离最小的顶点加入S中(相当于集合与集合的最小距离),而dijsktra算法是不断寻找U中与集合S中的v0顶点之间距离最小的顶点加入S中(相当于点与集合的最小距离)。个人认为主要的两步是:①、找U(不属于最小生成树/最短路径集合的顶点)中距离(S/v0)最小的顶点并加入到S中;②、更新S/v0到U中其余点的距离。
转载请注明原文地址: https://yun.8miu.com/read-111004.html