5.3城市地图——图的深度优先遍历

来源:互联网 发布:国家数据网 编辑:程序博客网 时间:2024/06/15 04:17
#include<cstdio>#include<iostream>using namespace std;int Min=99999999,book[101],n,e[101][101];//book数组用来标记 //我们这里假设99999999为正无穷 //cur是当前所在的城市编号,dis是当前已经走过的路程void dfs(int cur,int dis){int j;//如果当前走过的路程已经远大于之前找到的最短路,则没有必要再往下尝试了,立即返回if(dis>Min){return;} if(cur==n){//判断是否到达了目标城市if(dis<Min){Min=dis;//更新最小值 } return;}for(j=1;j<=n;j++){//从1号城市到n号城市依次尝试//判断当前城市cur到城市j是否有路,并判断城市j是否在已走过的路径中if(e[cur][j]!=99999999&&book[j]==0){book[j]=1;//标记城市j已经在路径中dfs(j,dis+e[cur][j]);//从城市j再出发,继续寻找目标城市book[j]=0;//之前一步探索完毕之后,取消对城市j的标记 } }return;}int main(){int i,j,m,a,b,c;cout<<"请输入n m"<<endl<<"表示有n个城市,共有m条路径:"<<endl;cin>>n>>m;//初始化二维矩阵for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=99999999;}}} cout<<"请输入a b c,表示城市a可以到达城市b,路径长度为c:"<<endl;//读入城市之间的道路for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c; } //显示原始航班矩阵cout<<endl<<"原始航班对应的抽象矩阵为:"<<endl;//n个城市,形成n*n二维矩阵 for(i=1;i<=n;i++){for(j=1;j<=n;j++){printf("%10d",e[i][j]);if(j==n){cout<<endl;}}}  //从1号城市出发book[1]=1;//标记1号城市已经在路径中dfs(1,0);//1表示当前所在的城市编号,0表示当前已经走过的路程cout<<endl<<endl<<"1号城市到"<<n<<"号城市的最短路径为:"<<Min;//打印1号城市到5号城市的最短路径getchar();return 0;}

0 0