#include <stdio.h>
#include <stdlib.h>
#define MAX 20
#define INFINITY 65538
typedef int AdjMatrix[MAX][MAX];//存储图
typedef int PathMatrix[MAX][MAX];//记录v0到各点的最短路径
typedef int ShortPath[MAX];//辅助数组,记录最短距离
typedef struct{
int vexnum,arcnum;
int visited[MAX];
char vexs[MAX];
AdjMatrix arcs;
PathMatrix path;
ShortPath flag;
}MGraph;
int LocateAdj(MGraph G, char v){//查找顶点的位置
int i;
for(i = 0; i < G.vexnum; i ++){
if(G.vexs[i] == v)
return i;
}
return -1;
}
void CreateMGraph(MGraph &G){
int i,j,k,cost;
char v1,v2;
for(i = 0; i < G.vexnum; i ++){
for(j = 0; j < G.vexnum; j ++){
G.arcs[i][j] = INFINITY;
}
}
printf("请输入结点数以及边的数目:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("请输入%d个结点:\n",G.vexnum);
getchar();
for(i = 0; i < G.vexnum; i ++)
scanf("%c",&G.vexs[i]);
printf("请输入%d条边以及权值:\n",G.arcnum);
for(i = 0; i < G.arcnum; i ++){
getchar();
scanf("%c%c%d",&v1,&v2,&cost);
j = LocateAdj(G,v1); k = LocateAdj(G,v2);
G.arcs[j][k] = cost;
}
}
void ShortestPath_DIJ(MGraph &G, int v){//最短路径
int i,j,ans;
for(i = 0; i < G.vexnum; i ++){
G.visited[i] = 0;//标志数组,记录是否访问过该顶点
G.flag[i] = G.arcs[v][i];//初始化辅助数组
for(j = 0; j < G.vexnum; j ++)
G.path[i][j] = 0;//初始化记录数组
ans = 1;
if(G.flag[i] < INFINITY){//连通,改变path数组元素值
G.path[i][v] = ans;
G.path[i][i] = ++ ans;
}
}
G.visited[v] = 1; G.flag[v] = 0;
for(i = 1; i < G.vexnum; i ++){
int min = INFINITY;
for(j = 0; j < G.vexnum; j ++){//查找最小元素
if(!G.visited[j] && min > G.flag[j]){
min = G.flag[j];
v = j;
}
}
G.visited[v] = 1;
for(j = 0; j < G.vexnum; j ++){//修改,更新最小元素
if(G.arcs[v][j] + min < G.flag[j] && !G.visited[j]){
G.flag[j] = G.arcs[v][j] + min;
ans = 1;//用来标记访问的顺序;
for(int k = 0; k < G.vexnum; k ++){
G.path[j][k] = G.path[v][k];//把上一组最小元素的一行赋值过来
if(G.path[v][k])
ans ++;
}
G.path[j][j] = ans;
}
}
}
}
int main(){
MGraph G;
int i,j;
CreateMGraph(G);
ShortestPath_DIJ(G,0);
for(i = 0; i < G.vexnum; i ++){
for(j = 0; j < G.vexnum; j ++)
printf("%d\t",G.path[i][j]);
putchar('\n');
}
return 0;
}
迪杰斯特拉算法
最新推荐文章于 2023-06-17 23:28:06 发布