使用二维数组模拟地图信息,a[i][j]==0表示i==j即同一地点,a[i][j]==-1表示i无法到达j(但是j可能可以到达j),a[i][j]==n(n>0)表示从i到j行驶的路程为n,利用深度优先搜索法找出一条条线路,再挑选出最短的那条
#include<iostream>
using namespace std;
int min = 999999;//初始置为一个较大的数
int deration[20] = { 0 };//用于储存线路信息
int t = 0;//线路中途径的城市数
void dfs(int a[20][20], int book[50], int n, int cur, int end,int distence)//a数组用于储存地图信息,book数组用于储存已访问过的城市,n表示地图信息中城市的数目,cur表示当前到达的城市,end表示终点,distance表示从起点到当前点的路程
{
if (cur == end)//到达目的点则输出线路,寻找最短路程
{
cout << "线路:";
for (int i = 0; i < t-1; i++)
cout << deration[i] << "->";
cout << deration[t - 1];
cout << " 路程:" << distence << endl;
if (distence < min)
min = distence;
}
else
{
for (int i = 1; i <= n; i++)//寻找cur当前点可到达且未访问过的点
{
if (a[cur][i] != 0 && a[cur][i] != -1 && book[i] == 0)//能到达、没有访问过
{
book[i] = 1;//将即将访问的点置为已访问
deration[t++] = i;//将线路信息储存
dfs(a, book, n, i, end, distence + a[cur][i]);//递归调用,访问下一个城市,distence + a[cur][i]表示路程增加cur到i的路程
book[i] = 0;//回溯时将i城市重置为未访问
deration[--t] = 0;//回溯时将i城市从线路中删除
}
}
}
}
int main()
{
int a[20][20], book[50] = { 0 }, n, m, t1, t2, t3, begin, end;//a数组用于储存地图信息,book数组用于储存已访问过的城市,n表示地图信息中城市的数目,begin表示起点,end表示终点
//t1,t2,t3用于输入公路信息,t1表示路的起点,t2表示路的终点,t3表示这条路的长度
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
if (i == j)//自己到自己的距离为零
a[i][j] = 0;
else//初始置为无法到达
a[i][j] = -1;
}
}
cout << "请输入地图中城市的个数:";
cin >> n;
cout << "请输入公路的条数:";
cin >> m;
cout << "请依次输入公路信息(格式:x y z表示x到y的公路,长度为z):" << endl;
for (int i = 0; i < m; i++)
{
cout << "请输入第 " << i + 1 << " 条:";
cin >> t1 >> t2 >> t3;
a[t1][t2] = t3;
}
cout << "请输入起点的位置:";
cin >> begin;
while (begin<1 || begin>n)//防止非法输入
{
cout << "输入的位置不在地图信息内!";
cout << "请重新输入起点的位置:";
cin >> begin;
}
cout << "请输入终点的位置:";
cin >> end;
while (end<1 || end>n)//防止非法输入
{
cout << "输入的位置不在地图信息内!";
cout << "请重新输入终点的位置:";
cin >> end;
}
book[begin] = 1;//初始赋值
deration[t++] = begin;//线路初始化
dfs(a, book, n, begin, end, 0);//开始寻找
cout << "最短的距离为:" << min << endl;
return 0;
}
简单示例及结果: