33,311
社区成员
发帖
与我相关
我的任务
分享
//graph.h
#include<iostream>
using namespace std;
#define MAX 20
#define INF 32767
typedef struct{
int arcs[MAX][MAX]; //邻接矩阵
}Mgraph;
//main.cpp
#include<iostream>
#include "graph.h"
using namespace std;
void dijkstra(Mgraph gn,int vtxnum,int v0,int path[],int dist[]){
int i;
int s[MAX]; //s用以标记那些已经找到最短路径的顶点,数组的初态只包括顶点v0,即s[0]=1
dist[i] = gn.arcs[0][i]; //数组dist记录源点到其他各顶点当前的最短距离
//初始化s,dist,path
for(int v=0;v<vtxnum;v++){
s[v] = 0;
dist[v] = gn.arcs[v0][v];
if(dist[v]<INF){
path[v] = v0;
}
else{
path[v] = -1;
}
dist[v0] = 0;
s[v0] = 1; //初始时源点v0∈s
for(int i=1;i<vtxnum-1;i++){
int min = INF;
v = -1;
//找出最小的dist[w]
for(int w=0;w<vtxnum;w++)
if(!s[w]&&dist[w]<min){
v = w;
min = dist[w];
}
if(v==-1) break; //已无顶点可加入,退出
s[v] = 1; //顶点v并入s
//调整集合(V-S)中的各个顶点的距离值
for(int j=0;j<vtxnum;j++){
if(!s[j]&&(min+gn.arcs[v][j]<dist[j])){
dist[j] = min+gn.arcs[v][j];
path[j] = v;
}
}
}
}
}
int main(){
int path[MAX];
int dist[MAX];
int vtxnum;
int v0,n;
Mgraph gn;
cout<<"请输入图的顶点个数:"<<"\n";
cin>>vtxnum;
gn.arcs[12][12] = {{0,15,4,7,INF,INF,INF,INF,INF,INF,INF,INF}, -----------------*
{15,0,7,INF,15,12,INF,INF,INF,INF,INF,INF},
{4,7,0,INF,16,INF,INF,INF,INF,INF,INF,INF},
{7,INF,INF,0,8,INF,INF,INF,26,INF,INF,INF},
{INF,15,16,8,0,20,18,INF,30,INF,INF,INF},
{INF,12,INF,INF,20,0,INF,INF,INF,30,INF,INF,INF},
{INF,INF,INF,18,INF,0,3,INF,16,INF,INF,INF},
{INF,INF,INF,INF,INF,INF,3,0,7,INF,INF,INF},
{INF,INF,INF,26,30,INF,INF,7,0,5,15,INF,INF},
{INF,INF,INF,INF,INF,30,19,INF,5,0,INF,20},
{INF,INF,INF,INF,INF,INF,INF,INF,15,INF,0,9},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,20,9,0}};
cout<<"请输入所要求最短路径的顶点:"<<"\n";
cin>>v0;
dijkstra(gn,vtxnum,v0,path,dist);
cout<<"请输入"<<v0<<"要到的点:"<<"\n";
cin>>n;
for(int i=0;i<=n;i++){
cout<<"从"<<v0<<"到"<<n<<"的最短路径是:"<<"\n";
cout<<path[i]<<"------->"<<"\n";
}
system("pause");
return 0;
}