最短路径
在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短值。
#include "stdafx.h" #include<deque> #include<iostream> using namespace std; #define N 9 #define MIN 1000000 typedef struct{ int vexnum, arcnum; char vexs[N]; int matirx[N][N]; }graph; graph g; // 初始化图数据 // 0---1---2---3---4---5---6---7---8--- // A---B---C---D---E---F---G---H---I--- void initiate_graph() { // A-B, A-D, A-E g.matirx[0][1] = 10; g.matirx[1][0] = 10; g.matirx[0][3] = 5; g.matirx[3][0] = 5; g.matirx[0][4] = 7; g.matirx[4][0] = 7; // B-C g.matirx[1][2] = 18; g.matirx[2][1] = 18; // C-F g.matirx[2][5] = 3; g.matirx[5][2] = 3; // D-E, D-G g.matirx[3][4] = 9; g.matirx[4][3] = 9; g.matirx[3][6] = 25; g.matirx[6][3] = 25; // E-F, E-H g.matirx[4][5] = 1; g.matirx[5][4] = 1; g.matirx[4][7] = 14; g.matirx[7][4] = 14; // F-H, F-I g.matirx[5][7] = 8; g.matirx[7][5] = 8; g.matirx[5][8] = 30; g.matirx[8][5] = 30; // G-H g.matirx[6][7] = 6; g.matirx[7][6] = 6; // H-I g.matirx[7][8] = 20; g.matirx[8][7] = 20; } deque<int>find_min_path(int m, int n, graph g) { int a[N] = { 0 }; deque<deque<int>>aa; deque<int>bb, pp, minpath; int min = MIN; for (int i = 0; i < N; i++) if (g.matirx[m][i]) pp.push_back(i); aa.push_back(pp); pp.clear(); bb.push_back(m); a[m] = 1; bb.push_back(aa[0][0]); a[aa[0][0]] = 1; aa[0].pop_front(); while (true) { while (bb.back() != n) { for (int i = 0; i < N; i++) if (g.matirx[bb.back()][i] && a[i] == 0) pp.push_back(i); if (pp.empty()) break; bb.push_back(pp.front()); a[pp.front()] = 1; pp.pop_front(); aa.push_back(pp); pp.clear(); } if (bb.back() == n) { int sum = 0; for (int i = 0; i < bb.size()-1; i++) sum += g.matirx[bb[i]][bb[i + 1]]; if (sum < min) { min = sum; minpath = bb; } } a[bb.back()] = 0; bb.pop_back(); while (aa.back().empty()) { aa.pop_back(); a[bb.back()] = 0; bb.pop_back(); if (aa.empty()) return minpath; } bb.push_back(aa.back()[0]); a[aa.back()[0]] = 1; aa.back().pop_front(); } } int _tmain(int argc, _TCHAR* argv[]) { initiate_graph(); deque<int>minpath=find_min_path(0, 8, g); system("pause"); return 0; }
版权声明: