DFS求最短路

题目:城市地图

输入第一行表示有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
*/

原文地址:https://www.cnblogs.com/kzbin/p/9205237.html