美文网首页
图的深度遍历求最短路径

图的深度遍历求最短路径

作者: 冷森_a317 | 来源:发表于2018-02-15 10:58 被阅读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           

第一行的5表示有5个城市,8表示有8条公路。接下来的8行每行是一条类似“a  b  c”的数据:表示从城市a到城市b有c公里

已知有5个城市8条路径,可以用一个5*5的矩阵(二维数组e)来存储这些信息。

此外还需要一个book数组来记录哪些城市已经走过,以免出现死循环。


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define INF 999999

int book[101], e[101][101];

int n;

int min = 9999999;

int path[100];      /// 用来保存路径

void dfs(int cur, int dis)

{

    int i;

    if (n == cur) //判断是否到达了目标城市

    {

        for (i = 1; i <= n; i++)    /// 输出所有可能的路径

        {

            if (path[i])

            {

                printf("%d ", path[i]); //输出路径

            }

        }

        printf("\t\t该路径对应的长度是:%d\n", dis);//输出对应路径长度

        if (min > dis)  //更新最小路径

        {

            min = dis;

        }

        return;

    }

    for (i = 1; i <= n; ++i)  //从1号城市到n号城市依次尝试

    {

        //判断当前城市cur到城市i是否有路,并判断城市i是否在已走过的路径中

        if (e[cur][i] != INF && book[i] == 0)

        {

            book[i] = 1;//标记城市i已经在路径中

            path[i] = i;//保存路劲到path数组中

            dfs(i, dis + e[cur][i]);

            book[i] = 0;        /// 之前一部探索完毕后,取消对城市 i 的标记以便另一条路径选择顶点

            path[i] = 0;

        }

    }

}

int main(/*int argc, char const *argv[]*/)

{

    int i, j, a, b, c, m;

    scanf_s("%d %d", &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] = INF;

            }

        }

    }

    //读入城市之间的道路

    for (i = 1; i <= m; ++i)

    {

        scanf_s("%d %d %d", &a, &b, &c);

        e[a][b] = c;

    }

    book[1] = 1; //标记1号城市已经在路径中

    path[1] = 1;

    dfs(1, 0);//1表示当前所在城市标号,0表示当前已经走过的路程

    printf("最短路径的长度是:\n");

    printf("%d\n", min);//打印最短路径

    system("pause");

    return 0;

}


上图对应的是有向图,如果是无向图怎么办呢?

其实,很简单:只需要在存储的时候加一句:e[b][a]=c ,并且修改一下for循环的参数防止重复for (i = cur; i <= n; ++i)

直接上代码和结果:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define INF 999999

int book[101], e[101][101];

int n;

int min = 9999999;

int path[100];      /// 用来保存路径

void dfs(int cur, int dis)

{

    int i;

    if (n == cur) //判断是否到达了目标城市

    {

        for (i = 1; i <= n; i++)    /// 输出所有可能的路径

        {

            if (path[i])

            {

                printf("%d ", path[i]); //输出路径

            }

        }

        printf("\t\t该路径对应的长度是:%d\n", dis);//输出对应路径长度

        if (min > dis)  //更新最小路径

        {

            min = dis;

        }

        return;

    }

    for (i = cur; i <= n; ++i)  //从1号城市到n号城市依次尝试

    {

        //判断当前城市cur到城市i是否有路,并判断城市i是否在已走过的路径中

        if (e[cur][i] != INF && book[i] == 0)

        {

            book[i] = 1;//标记城市i已经在路径中

            path[i] = i;//保存路劲到path数组中

            dfs(i, dis + e[cur][i]);

            book[i] = 0;        /// 之前一部探索完毕后,取消对城市 i 的标记以便另一条路径选择顶点

            path[i] = 0;

        }

    }

}

int main(/*int argc, char const *argv[]*/)

{

    int i, j, a, b, c, m;

    scanf_s("%d %d", &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] = INF;

            }

        }

    }

    //读入城市之间的道路

    for (i = 1; i <= m; ++i)

    {

        scanf_s("%d %d %d", &a, &b, &c);

        e[a][b] = c;

        e[b][a] = c;

    }

    book[1] = 1; //标记1号城市已经在路径中

    path[1] = 1;

    dfs(1, 0);//1表示当前所在城市标号,0表示当前已经走过的路程

    printf("最短路径的长度是:\n");

    printf("%d\n", min);//打印最短路径

    system("pause");

    return 0;

}

相关文章

  • 搜索

    一、深度优先搜索 图深度优先遍历、深度优先搜索算法求有权图两点最短路径 二、广度优先搜索 图广度优先遍历、广度优先...

  • 南京地铁最短路径以及最少换乘算法C++不用类

    迪杰斯特拉算法应用于南京地铁求最短路径 深度遍历求图中所有路径 定义的变量名及其作用 然后迪杰斯特拉遍历图是单独放...

  • 图的深度遍历求最短路径

    原文 城市的地图如下图所示 数据是这样给出的: 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 ...

  • [考研]数据结构必考代码

    (十二)图的遍历 深度优先搜索 广度优先搜索 示例: BFS算法求解非带权图单源最短路径算法: (十三)最小生成树...

  • 遍历 最短路径 1.单源最短路 有权图-Dijkstra 多源头最短路-Floyd算法 —————————————...

  • 图论算法(二)广度优先搜索

    这是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先我们先来看看广度...

  • 最短路径

    无权图的最短路径用BFS来求 O(|V|+|E|) 有向带权图两点之间的最短路径也包含了路径上其他顶点间的最短路径...

  • java最短路径(jgrapht)

    基于jgrapht求最短路径的算法,有向图/无向图,加权图

  • 11.图的广度优先遍历与无权图的最短路径

    图的广度优先遍历与无权图的最短路径 点击这里,前提知晓... 一、图的广度优先遍历 和树的广度优先遍历的思想一样,...

  • 数据结构-图

    邻接矩阵中的两个最短路径算法,Djkstra,Floyd 以邻接表存储的两种遍历,深度优先遍历和广度优先遍历,类比...

网友评论

      本文标题:图的深度遍历求最短路径

      本文链接:https://www.haomeiwen.com/subject/jtaytftx.html