// Dijkstra.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define MAX 100
#define INF 0x7ffff
typedef struct{
int e;//边数
int v;//顶点数
int graph[MAX][MAX];
}MGraph;
void Ppath(int path[], int i, int v){
int k;
k = path[i];
if (k == v)
{
return;
}
Ppath(path, k, v);
printf("%d,", k);
}
void Dispatch(int dist[], int path[], int vset[], int n, int v){
int i;
for (size_t i = 0; i < n; i++)
{
if (vset[i] == 1){
if (i!=v)
{
printf(" 从%d到%d的最短路径长度为:%-4d 路径为:", v, i, dist[i]);
printf("%d,", v);
Ppath(path, i, v);
printf("%d\n", i);
}
else
{
printf("从%d 到 %d不存在路径\n", v, i);
}
}
}
}
void Dijkstra(MGraph graph,int start){
int path[MAX];//存放路径
int vset[MAX];//vset[i]= 1表示已经加入S集合重,反之在U集合
int dist[MAX];//存放从源点到vi目前的最短路径
for (size_t i = 0; i < graph.v; i++)
{
if (graph.graph[start][i]<INF)
{
path[i] = start;
}
else
{
path[i] = -1;
}
dist[i] = graph.graph[start][i];
vset[i] = 0;
}
vset[start] = 1; path[start] = 0;
//找到权值最小的结点
for (size_t i = 0; i < graph.v; i++)
{
int min = INF;
int minid = -1;
for (size_t j = 0; j < graph.v; j++)
{
if (min>dist[j] && vset[j] == 0)
{
min = dist[j];
minid = j;
}
}
vset[minid] = 1;
for (size_t k = 0; k < graph.v; k++)
{
if (vset[k] == 0)
{
if (dist[k]>graph.graph[minid][k] + dist[minid] && graph.graph[minid][k]<INF){
path[k] = minid;
dist[k] = graph.graph[minid][k] + dist[minid];
}
}
}
}
Dispatch(dist, path, vset, graph.v, 0);
}
int _tmain(int argc, _TCHAR* argv[])
{
MGraph mGraph = {
12,7,
{
{ 0, 4, 6, 6, INF, INF, INF },
{ INF, 0, 1, INF, 7, INF, INF },
{ INF, INF,0,INF,6,4,INF },
{ INF, INF, 2, 0, INF, 5, INF },
{ INF, INF, INF, INF, 0, INF, 6 },
{ INF, INF, INF, INF, 1, 0, 8 },
{ INF, INF, INF, INF, INF, INF }
}
};
Dijkstra(mGraph, 0);
_tsystem(_T("pause"));
return 0;
}
![](https://img-blog.csdn.net/20161215093907086?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUFOR0ZSQU5LTFk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)