图的只操作复杂,但很在意义和意思。这里根据课本精华,实现一个图的最短路径算法,请参考。
准备计算课本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 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,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; }
程序运行时界面如下:
大家可以输入其它图形进行验证。祝大家成功。