题目:城市地图
输入第一行表示有n个城市,m条马路。
接下来m行是类似于a b c这样的数据,表示有一条路可以从城市a到b,且路程为c公里。
需要注意的是这里的路都是单向的,也就是有向图。
求出1号城市到n号城市的最短距离。
分析:求最短路可以用DFS,BFS,Dijksrta,Floyed 等算法求解。目前在看图的遍历,就用DFS了。。。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #define INF 99999999 using namespace std; const int maxn=105; int e[maxn][maxn]; int vis[maxn]; int minx=INF; int sx,ex; int n,m; void init(){//初始化 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) e[i][j]=0;//自己到自己的距离为0 else e[i][j]=INF;//初始为无穷大,说明此事城市i和城市j之间还没有路相通 } } } void dfs(int now,int step){ if(step>minx) return ; if(now==n){ if(step<minx){ minx=step;//更新最短路 } return; } for(int j=1;j<=n;j++){ if(e[now][j]!=INF&&!vis[j]){ vis[j]=1; dfs(j,step+e[now][j]); vis[j]=0; } } return; } int main() { int a,b,c; scanf("%d %d",&n,&m); init(); for(int i=1;i<=8;i++){ scanf("%d %d %d",&a,&b,&c); e[a][b]=c; } memset(vis,0,sizeof vis); vis[1]=1; dfs(1,0); printf("%d ",minx); return 0; } /* 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 */