#include<stdio.h>
#include<stdlib.h>
typedef int VertexType;//顶点类型
typedef int EdgeType;
#define MAXVEX 100//最大顶点数
#define MAXEDGE 200//最大边数
#define INFINITY 65535//代表无穷大,两个顶点之间不可达
int visited[MAXVEX];//访问标志的数组
typedef struct{
VertexType vexs[MAXVEX];//顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
int numVertexes,numEdges;//图中当前的顶点数和边数
}MGraph;
void CreateMGraph(MGraph * G)
{
int i,j,k,w;
printf("输入顶点数和边数:");
scanf("%d %d",&G->numVertexes,&G->numEdges);
printf("输入顶点:");
for(i=0;i<G->numVertexes;i++)
scanf("%d",&G->vexs[i]);
// getchar();
for(i=0;i<G->numVertexes;i++)
for(j=0;j<G->numVertexes;j++)
G->arc[i][j]=INFINITY;//邻接矩阵初始化
for(k=0;k<G->numEdges;k++)
{
printf("请输入vi vj的下标i j和对应的权值:");
scanf("%d %d %d",&i,&j,&w);
G->arc[i][j]=w;
G->arc[j][i]=G->arc[i][j];//无向图,邻接矩阵对称
}
}
void Dijkstra(MGraph G,int v0)
{
int p[MAXVEX];//用于存储最短路径下标的数组
int d[MAXVEX];//用于存储到各点最短路径的权值和
int final[MAXVEX];//final[k]=1表示求得v0到vk的最短路径
int v,k,w,min;
for(v=0;v<G.numVertexes;v++)
{
final[v]=0;//全部顶点初始化为未知最短路径状态
d[v]=G.arc[v0][v];//将与v0有连线的顶点加上权值
p[v]=0;//初始化路径数组为0
}
d[v0]=0;//v0->v0的路径为0
final[v0]=0;//v0到v0不需要求路径
for(v=1;v<G.numVertexes;v++)
{
min=INFINITY;//当前所知离v0顶点的最近距离
for(w=0;w<G.numVertexes;w++)
{
if(!final[w]&&d[w]<min)//寻找离v0最近的顶点
{
k=w;
min=d[w];
}
}
final[k]=1;//将目前找到的最近的顶点置为1
for(w=0;w<G.numVertexes;w++)//如果经过v顶点的路径比现在这条路径的长度更短的话
{
if(!final[w]&&(min+G.arc[k][w]<d[w]))//找到了更短的路径,修改d[w]和p[w]
{
d[w]=min+G.arc[k][w];
p[w]=k;
}
}
}
for(v=0;v<G.numVertexes;v++)
{
printf("(%d,%d)--%d\n",v0,v,d[v]);
}
}
int main()
{
MGraph *G;
G=(MGraph*)malloc(sizeof(MGraph));
CreateMGraph(G);
Dijkstra(*G,7);
return 0;
}
/*
0 1 1
0 2 5
1 2 3
1 3 7
1 4 5
2 4 1
2 5 7
3 4 2
3 6 3
4 6 6
4 7 9
4 5 3
5 7 5
6 7 2
6 8 7
7 8 4
时间复杂度O(n^2)
*/
单源最短路径-----Dijkstra算法
最新推荐文章于 2022-04-28 16:09:09 发布