图的深度优先遍历--城市地图

//题目:第一行第一个数n表示城市个数(1~n),第二个数m表示公路个数
//接下来有m行数据表示c到d有e千米,每条公路都是单行的,求1到n的最短路径

#include <stdio.h>

int book[100];

int a[100][100];

int min=10000;

int n;

int dfs(int cur,int step);

int main()

 {

     int m,i,j,c,d,e;

     scanf(“%d%d”,&n,&m);

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

        book[i]=0;

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

        for (j=1;j<=n;j++)

        if (i==j) a[i][j]=0;

     else

         a[i][j]=100000;

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

     {

         scanf(“%d%d%d”,&c,&d,&e);

         a[c][d]=e;//单行的

     }

     book[1]=1;

     dfs(1,0);

     printf(“%d\n”,min);

 }

 int dfs(int cur,int step)

 {

     int i;

     if (step>min)

        return;//优化,如果已经超过最小步数则不需要再深搜

     if (cur==n)

     {

         if (step<min)

        min=step;//更新最小值

         return;

     }

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

        if ((a[cur][i]!=0)&&(a[cur][i]!=100000)&&(book[i]==0))

     {

         book[i]=1;

         dfs(i,step+a[cur][i]);

         book[i]=0;

     }

     return;

 }

//注:因为之前是访问节点,所以每个节点只能访问一次,而城市可能在另一个递归中还要访问它。

《图的深度优先遍历--城市地图》

比如如图深度优先搜索顺序是1-2-3,因而当访问到3时,book[2]=1,而1-3-2却可能比1-2还要小,所以book[2]必须要为0

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/fengsigaoju/article/details/46795383
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞