//算法思想就不多写了,网上多的是。 //自己练习练习算法,如有错误,欢迎指正! #include <iostream> #include <fstream> using namespace std; class shortestPath{ private: static const int N = 51; static const int INF = 100000;//表无穷大 int n;//顶点总数 int u;//入口点 int arrTemp[N][N]; //arrTemp存放过程最小值, 且arrTemp[n][i]存放过程中距入口点的最短距离 int array[N][N]; int weightPath[N][N]; //矩阵weightPath[i][0]存放最短路径的最短距离,[i][1]存放最短路径的结点个数 public: shortestPath(){ ifstream in("matrix.txt"); //邻接矩阵从matrix.txt文件中读取 //其中第一行一个数据,表示结点的总数 //随后的n*n个数据表各结点之间的距离 in>>n;// for(int i=0; i<=n; i++) for(int j=0; j<n; j++) in>>array[i][j];/ cout<<"Input the gragh entry node u (u>=0 and u<" << n <<"):"; cin>>u; fun(); print(); } void fun();//算法过程 void print();//输出最终结果 ~shortestPath(){ }; }; void shortestPath::fun(){ int queue[N] = {0};//模拟队列 int temp;//中间转储 int flagH=0,flagR=0;//队头与队尾 queue[flagR] = u; flagR++; temp = queue[flagH]; for(int i=0; i<n; i++){//初始化入口点的最短距离 arrTemp[temp][i] = array[temp][i]!=0 ? array[temp][i] : INF; arrTemp[ n ][i] = array[temp][i]!=0 ? array[temp][i] : INF; if(array[temp][i] != INF && temp != i){ queue[flagR] = i; flagR++; } } flagH++; //计算过程中各结点路径最小值 while(flagH < flagR){ temp = queue[flagH]; flagH++; for(int i=0; i<n; i++){ if(array[temp][i] >= INF || temp == i) arrTemp[temp][i] = INF; else{ //计算过程路径值 if(arrTemp[i][temp]!= 0){ if(arrTemp[n][temp] - array[temp][i] == arrTemp[n][i] || arrTemp[i][temp] - array[temp][i] == 0) arrTemp[temp][i] = arrTemp[n][temp]; else arrTemp[temp][i] = array[temp][i] + arrTemp[n][temp]; } else arrTemp[temp][i] = array[temp][i] + arrTemp[n][temp]; //重新确定当前结点的最短路径 arrTemp[n][i] = arrTemp[n][i] < arrTemp[temp][i] ? arrTemp[n][i] : arrTemp[temp][i]; //判断当前结点是否需要入栈 int flag = 1; for(int j=0; j<flagR; j++) if(i == queue[j]){ flag=0; break; } if(flag == 1){ queue[flagR] = i; flagR++; } } } } //确定入口点到各点的最短路径经过的顶点 arrTemp[n][u] = 0; int x=0,k; for(int i=0; i<n; i++){ k=2; if(i == u) continue; weightPath[i][0] = arrTemp[n][i]; weightPath[i][k++] = i; x = i; temp = arrTemp[n][i]; //确定最小路径的终点 while(temp>0){ //确定中间点 for(int j=0; j<n; j++){ if(temp == arrTemp[j][x]){ temp -= array[j][x]; weightPath[i][k++] = j; if(temp == 0){ weightPath[i][k] = u; weightPath[i][1] = k-2; } break; } } for(int h=0; h<n; h++){ if(h == u) continue; if(temp == arrTemp[n][h]) x=h; } } } } void shortestPath::print(){ for(int i=0; i<n; i++){ if(i==u) continue; cout<<"The shortest path from [" << u << "] to [" << i << "] :/n" << "Minimum Weight: " << weightPath[i][0] << "/n" << "Path:/t"; for(int j=weightPath[i][1]+1; j>1; j--) cout<<weightPath[i][j] << "/t"; cout<<endl; } } int main(){ shortestPath a; cout<<"/n------ Over -------"<<endl; return 0; }