最短路径
在无向图 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;
}