源代码:
#include<bits/stdc++.h>
#define M 20
#define N 5000
using namespace std;
typedef struct{
char vexs[M];
int edges[M][M];
int n,e;
}mgraph;
typedef int dist[M];
typedef int path[M];
typedef int dis[M][M];
typedef int pat[M][M];
void creat(mgraph *g,int c){
cout<<"Please input the value of n,e:";
cin>>g->n>>g->e;
int i,j,w;
cout<<"Please input the data of nodes:";
for(i=0;i<g->n;i++)cin>>g->vexs[i];
for(i=0;i<M;i++){
for(j=0;j<M;j++){
if(i==j)g->edges[i][j]=0;
else g->edges[i][j]=N;
}
}
for(int k=0;k<g->e;k++){
cout<<"Please input the value of i,j,w:";
cin>>i>>j>>w;
g->edges[i][j]=w;
if(c==0)g->edges[j][i]=w;
}
}
//Dijkstra算法
void dijkstra(mgraph g,int v0,path p,dist d){
bool final[M];
int i,k,j,v,minn;
for(v=0;v<g.n;v++){
final[v]=false;
d[v]=g.edges[v0][v];
if(d[v]!=0&&d[v]<N)p[v]=v0;
else p[v]=-1;
}
final[v0]=true;
d[v0]=0;
for(i=1;i<g.n;i++){
minn=N;
for(k=0;k<g.n;k++){
if(!final[k]&&d[k]<minn){
v=k;minn=d[k];
}
}
cout<<g.vexs[v]<<" "<<minn<<endl;
if(minn==N)return;
final[v]=true;
for(k=0;k<g.n;k++){
if(!final[k]&&(minn+g.edges[v][k])<d[k]){
d[k]=minn+g.edges[v][k];
p[k]=v;
}
}
}
}
void print_gpd(mgraph g,path p,dist d){
int st[M],i,pre,top;
for(i=0;i<g.n;i++){
top=-1;
cout<<"Distanced "<<d[i]<<":";
st[++top]=i;
pre=p[i];
while(pre!=-1){
st[++top]=pre;
pre=p[pre];
}
while(top>=0){
cout<<st[top--]<<" ";
}
cout<<endl;
}
}
//Floyd算法 (所有顶点对的最短路径)
void floyd(mgraph g,pat p,dis d){
int i,j,k;
for(i=0;i<g.n;i++){
for(j=0;j<g.n;j++){
d[i][j]=g.edges[i][j];
if(i!=j&&d[i][j]<N)p[i][j]=i;
else p[i][j]=-1;
}
}
for(k=0;k<g.n;k++){//递推求解每一对顶点间的最短距离
for(i=0;i<g.n;i++){
for(j=0;j<g.n;j++){
if(d[i][j]>(d[i][k]+d[k][j])){
d[i][j]=d[i][k]+d[k][j];
p[i][j]=p[k][j];
}
}
}
}
}
void outputpath(mgraph g,pat p,dis d){
int i,j,k,v;
int s[M],top;
for(i=0;i<g.n;i++){
for(j=0;j<g.n;j++){
if(d[i][j]!=N&&i!=j){
printf("The distance of path from%dto%dis:%d\t",i,j,d[i][j]);
cout<<"The path:";
k=p[i][j];
top=0;
s[top]=j;//最短路径的终点
while(k!=-1&&k!=i){//寻找路径的中间顶点。
top++;
s[top]=k;
k=p[i][k];
}
s[++top]=i;//最短路径的节点
while(top>0)cout<<s[top--]<<" ";
cout<<s[top]<<endl;
}
}
}
}
int main(){
mgraph g;
path p;dist d;
pat p1;dis d1;
int v0;
creat(&g,1);
cout<<"Dijkstra算法"<<endl;
cout<<"Please input the soure point v0:";
cin>>v0;
dijkstra(g,v0,p,d);
print_gpd(g,p,d);
cout<<"Floyd算法"<<endl;
floyd(g,p1,d1);
outputpath(g,p1,d1);
return 0;
}
运行结果: