源文件:
#include "graph.h"
int main()
{
string ch="abc";
MGraph m(ch,3,3);
m.Floyd();
m.print();
return 0;
}
头文件:
#ifndef GRAPH_H
#define GRAPH_H
#include <iostream>
#include <string>
using namespace std;
const int Maxsize = 10;
class MGraph
{
public:
MGraph(string a,int n,int e);
void Floyd();
void print();
private:
string vertex[Maxsize];
int arc[Maxsize][Maxsize];
int vertexNum,arcNum;
int dist[Maxsize][Maxsize];
string path[Maxsize][Maxsize];
};
MGraph:: MGraph(string a,int n,int e)
{
int i,j,k,info;
vertexNum = n;
arcNum = e;
for(i=0;i<vertexNum;i++)
vertex[i]=a[i];
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
arc[i][j]=0;
for(k=0;k<arcNum;k++)
{
cout<<"请输入边依附的两个顶点的编号"<<endl;
cin>>i>>j;
while(i>=vertexNum && j>=vertexNum)
{
cout<<"请重新输入"<<endl;
cin>>i>>j;
}
cout<<"请输入边的权值"<<endl;
cin>>info;
while(info < 0)
{
cout<<"请重新输入"<<endl;
cin>>info;
}
arc[i][j]=info;
}
for(i=0;i<vertexNum;i++)
{
for(j=0;j<vertexNum;j++)
cout<<arc[i][j]<<" ";
cout<<endl;
}
}
void MGraph::Floyd()
{
int i,j,k;
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
{
dist[i][j] = arc[i][j];
if(dist[i][j] != 0) path[i][j]=vertex[i]+vertex[j];
else path[i][j] =" ";
}
for(k=0;k<vertexNum;k++)
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
if(dist[i][k]+dist[k][j]<dist[i][j]) {
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k]+path[k][j];
}
}
void MGraph::print() //结点m到n的最短路径
{
cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;
string ch1,ch2;
cin>>ch1>>ch2;
int a,b,i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
for(i=0;i<vertexNum;i++)
{
for(int j=0;j<vertexNum;j++)
cout<<path[i][j]<<" ";
cout<<endl;
}
for(i=0;i<vertexNum;i++)
{
for(int j=0;j<vertexNum;j++)
cout<<dist[i][j]<<" ";
cout<<endl;
}
cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<endl;
}
#endif
我找了很久,发现Floyd()函数里的 dist[i][j] = arc[i][j]; 无效,为什么呢?
void MGraph::Floyd()
{
int i,j,k;
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
{
dist[i][j] = arc[i][j];
if(dist[i][j] != 0) path[i][j]=vertex[i]+vertex[j];
else path[i][j] =" ";
}