问题
已知一个图
求某个顶点出发到达其他顶点的最短路径
分析
已知一个图的顶点和其各边权重
求某个顶点s出发到达其他顶点的最短路径
G=(V,E,W) V={1,2,3…n} s=1
那么我们分为以下几个步骤:
1.初始S={1}
2.对于i∈V-S,计算1到i的相对S的最短距离,长度为dist[i]
3.选择V-S中dist值最小的j,将j加入S,修改V-S中的dist值
4.继续上述过程,直到S=V
总的来说:
就是每次向S中增加一个顶点,此顶点是与S中任一顶点相连的路径最短的点
过程:
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define MAX_VEX 100
#define inf 100000
#define ERROR -1
#define OK 1
#define TRUE 1
#define FLASE 0
using namespace std;
typedef int Status;
typedef struct
{
char vexs[MAX_VEX][MAX_VEX]; //景点向量代号
int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵
int vexnum;
int arcnum; //图的当前顶点数和弧数
} MGraph ; //图的结构定义
int locate(MGraph G,char c[]);//定位点
MGraph create();//创建无向图
void shortestd(MGraph G);//查看浏览路线
int locate(MGraph G,char c[]){//定位
int i=0;
for(i=0;i<G.vexnum;i++){
if(strcmp(G.vexs[i],c)==0) return i;
}
return -1;
}
MGraph create(){//创建图
MGraph G;
int i=0,j=0,k=0;
char ch1[MAX_VEX],ch2[MAX_VEX];
int flag[2]={-1};
int weigh;
printf("请输入顶点个数,边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
getchar();
while(i<G.vexnum){//输入图
printf("请输入顶点代号:");
scanf("%s",G.vexs[i]);
i++;
}
for(i=0;i<G.vexnum;i++){//初始化邻接矩阵
for(j=0;j<G.vexnum;j++){
G.arcs[i][j]=inf;
}
}
printf("请输入每条边依附的顶点代号和距离:\n");//输入各点间关系 ,第一个指向第二个
for(i=0;i<G.arcnum;i++){
scanf("%s",ch1);
getchar();
scanf("%s",ch2);
getchar();
scanf("%d",&weigh);
getchar();
flag[0]=locate(G,ch1);
flag[1]=locate(G,ch2);
G.arcs[flag[0]][flag[1]]=weigh;
}
return G;
}
void shortestd(MGraph G){//查看浏览路线
int i,j,k,n;
char v0[MAX_VEX];
printf("请输入起始顶点代号:");//输入景点代号
scanf("%s",v0);
int v=locate(G,v0);//定位
if(v==-1){
printf("输入的代号错误\n");
return ;
}
int final[MAX_VEX]={0},d[MAX_VEX]={0};
int p[MAX_VEX];
for(i=0;i<G.vexnum;i++){
d[i]=G.arcs[v][i];
p[i]=v;//保存最短路径顶点上一个顶点
}
d[v]=0;//初始化
final[v]=1;
for(i=0;i<G.vexnum;i++){//主循环,每次求到另一个点的最短路径
int min=inf;
n=-1;
for(j=0;j<G.vexnum;j++){
if(!final[j]){
if(d[j]<min){
n=j;
min=d[j];
}
}
}
final[n]=1;
for(j=0;j<G.vexnum;j++){
if(!final[j]&&(min+G.arcs[n][j]<d[j])){
d[j]=min+G.arcs[n][j];
p[j]=n;
}
}
}
for(i=0; i<G.vexnum; i++)
{
int k = i;
// 顶点sv到其它顶点的路径
printf("从%s 到 %s的最短距离为 %d\n路径为",G.vexs[v],G.vexs[k], d[k]);
// 最短路径顶点关系
do
{
printf("%s-> ",G.vexs[k]);
k=p[k];
} while( k!= v);
printf("%s\n",G.vexs[k]);
}
}
int main(){
MGraph G=create();
shortestd(G);
return 0;
}
路径输出为反向