复习一下Floyd算法,代码实现很简单,3个for循环,每一层循环的意思需要深刻的理解
推荐这片博客:http://blog.csdn.net/qq_34374664/article/details/52261672 有该算法的详细解释
(2017.3.1)我下面的代码有很明显的缺点,所有的改动都是在原有的存储矩阵之上,如果需要对原图进行其他分析,需要复制一个矩阵,对后者进行改动,传递至Floyd函数内的参数不应为引用
#include<iostream>#include<limits.h>
#include<queue>
#define MAXVEX 100
using namespace std;
typedef struct
{
int matrix[MAXVEX][MAXVEX];
int numNodes, numEdges;
} Graph;
void CreateGraph(Graph *Gp)
{
int i, j, k, w;
bool isDirected;
cout<<"无向图请输入0,有向图请输入1"<<endl;
cin>>isDirected;
cout<<"请输入顶点数和边数(空格分隔):"<<endl;
cin>>Gp->numNodes>>Gp->numEdges;;
for (i=1;i<=Gp->numNodes;i++)
{
for (j=1;j<=Gp->numNodes;j++)
{
if (i==j)
Gp->matrix[i][j]=0;
else
Gp->matrix[i][j]=INT_MAX;
}
}
cout<<"请输入边(vi, vj)和权值w,三个变量空格分隔即可:"<<endl;
for (k=0;k<Gp->numEdges;k++)
{
cin>>i>>j>>w;
Gp->matrix[i][j]=w;
if(!isDirected)
Gp->matrix[j][i]=Gp->matrix[i][j];
}
}
void ShowGraph(Graph M){
int i, j;
for(i=1;i<=M.numNodes;i++){
for(j=1;j<=M.numNodes;j++){
if(M.matrix[i][j]!=INT_MAX)
cout<<M.matrix[i][j]<<" ";
else
cout<<"*"<<" ";
}
cout<<endl;
}
}
void Floyd(Graph &M){
int distance;
for(int i=1;i<=M.numEdges;i++){
for(int j=1;j<=M.numEdges;j++){
for(int k=1;k<=M.numEdges;k++){
distance=M.matrix[j][i]+M.matrix[i][k];
if(distance<M.matrix[j][k])
M.matrix[j][k]=distance;
}
}
}
}
int main(){
Graph M;
CreateGraph(&M);
cout<<"邻接矩阵为:"<<endl;
ShowGraph(M);
Floyd(M);
cout<<"最短距离:"<<endl;
ShowGraph(M);
return 0;
}
运行结果: