第二類最短路徑 每一對頂點之間的最短路徑 弗洛伊德演算法
阿新 • • 發佈:2020-12-12
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int vexs[10];
int arcs[10][10];
int vnum;
}MGraph;
int path[100][100];
int d[100][100];
void creatAdjmatrix(MGraph &g){
int n,i,j;
cin>>n;
g.vnum=n;
for(i=0;i<n;i++){
g.vexs[i]=i;
for (j=0;j<n;j++){
g.arcs[i][j]=100;
if(i==j) g.arcs[i][j]=0;
}
}
cin>>i>>j>>n;
while(i!=-1&&j!=-1){
g.arcs[i][j]=n;
cin>>i>>j>>n;
}
}
void ShortestPath_Floyd(MGraph g){
for(int i=0;i<g.vnum;i++){
for(int j=0;j<g.vnum;j++){
d[ i][j]=g.arcs[i][j];
if(g.arcs[i][j]!=1000&&i!=j)path[i][j]=i;
else path[i][j]=-1;
}
}
for(int k=0;k<g.vnum;k++)
for(int i=0;i<g.vnum;i++)
for(int j=0;j<g.vnum;j++){
if(d[i][k]+d[k][j]<d[i][j] ){
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[k][j];
}
}
}
int main()
{
MGraph g;
creatAdjmatrix(g);//4 0 1 1 0 3 4 1 2 9 1 3 2 2 0 3 2 1 5 2 3 8 3 2 6 -1 -1 -1 //6 0 2 10 0 4 30 0 5 100 1 2 5 2 3 50 3 5 10 4 3 20 4 5 60 -1 -1 -1
ShortestPath_Floyd(g);
for(int i=0;i<g.vnum;i++){
for(int j=0;j<g.vnum;j++){
printf("%4d ",d[i][j]);
//cout<<d[i][j]<<" ";
if(j==g.vnum-1) cout<<endl;
}
}
return 0;
}