图的只操作复杂,但很在意义和意思。这里根据课本精华,实现一个图的最短路径算法,请参考。
准备计算课本P172,图6-13。如下:
#include <iostream>
#include <string>
#include<iomanip> //引入输入输出格式头文件
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++) //初始化边,请将不到达边初始值为最大值,这里使用10000
for(j=0;j<vertexNum;j++)
arc[i][j]=10000;
for(k=0;k<arcNum;k++) //输入图的边的顶点信息,将图顶点进行编号,从0开始
{ 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;
}
}
void MGraph::Floyd()
{ int i,j,k;
for(i=0;i<vertexNum;i++) //初始化dist和path
for(j=0;j<vertexNum;j++)
{ dist[i][j] = arc[i][j];
if(dist[i][j] != 10000)
path[i][j]=vertex[i]+vertex[j];
else path[i][j] =" ";
}
for(k=0;k<vertexNum;k++) //判定顶点i j之间是否经过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的最短路径
{ int a,b,i;
cout<<"图的所有路径如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的所有路径信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(10)<<setiosflags(ios::left)<<path[i][j]<<" "; //10个字符位置,且左对齐
cout<<endl;
}
cout<<"图的所有路径长如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的各边长信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(3)<<setiosflags(ios::left)<<dist[i][j]<<" "; //3个字符位置,且左对齐
cout<<endl;
}
cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;
string ch1,ch2;
cin>>ch1>>ch2; //输入要判定是的顶点,请输入顶点字符。
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"长度为"<<dist[a][b]<<endl;
system("pause");
}
int main()
{ int n,e;
string ch;
cout<<"请输入顶点数和边数,空格格开:"<<endl;
cin>>n>>e;
cout<<"请输入依次输入各个顶点字符串:"<<endl;
cin>>ch;
MGraph m(ch,n,e);
m.Floyd();
m.print();
return 0;
}
程序运行时界面如下:
大家可以输入其它图形进行验证。祝大家成功。