#include<iostream>
using namespace std;
#define nmax 100
#define inf 999999999
int minpath, n, m, en, edge[nmax][nmax], mark[nmax];//最短路径,节点数,边数,终点,邻接矩阵,节点访问标记
void dfs(int cur, int dst) //dsf代表当前路径,当前走过的公路数,cur代表出发的城市
{
if (minpath < dst) return;//当前走过的路径大于之前的最短路径,没有必要再走下去了
if (cur == en) {//临界条件,当走到终点n
if (minpath > dst) {
minpath = dst;
return;
}
}
for (int i = 1;i <= n;i++) {
if (mark[i] == 0 && edge[cur][i] != inf && edge[cur][i] != 0) {
mark[i] = 1;
dfs(i, dst + edge[cur][i]);
mark[i] = 0;//需要在深度遍历返回时将访问标志置0
}
}
return;
}
int main()
{
while (cin >> n >> m && n != 0) {
//初始化邻接矩阵
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= n;j++) {
edge[i][j] = inf;
}
edge[i][i] = 0; //因为自己和自己没什么好走的,所以为0
}
int a, b; //a代表开始的结点,b代表走到的结点
while (m--)
{
cin >> a >> b;
cin >> edge[a][b];
}
minpath = inf;
memset(mark, 0, sizeof(mark)); //就是让mark的所有mark的所有字节都是0,代表没有遍历
mark[1] = 1; //开始访问
en = n;
dfs(1, 0);
cout << minpath << endl;
}
}
之所有最短路径是9,是因为它是有向图,而不是无向的。
这道题的思路就是:
1.利用两个数组,一个是初始化邻接矩阵,把他们各个城市的路径表示出来,另一个数组则表示此城市是否被遍历
2.要想进行每个节点都遍历还是得用到递归,那么关于递归跳出的条件必然是走过的所有的当前走路径都大于最小路径