5.0 图与遍历搜索图

图的简介与二维数组

就是由顶点和连接顶点的组成的

表示图

我们利用二维数组表示图
二维数组的两个参数行列,均表示顶点,二者相交得到的即是距离
我们用正无穷(一般可以用999999代替)表示二者之间没有边,0是某点到自身的距离
比如e[a][b] = 3 ;就代表a到b的距离是3

图还分为有向图和无向图
顾名思义,有向图是有方向属性的,无向图则没有
换言之,对于无向图,我们有:

e[a][b] = e[b][a]

图的遍历

我们上一章学习了深度优先算法和广度优先算法
现在我们就利用它们来完成图的遍历
我们还是以一个例子来说吧

例题

假设我们在一个道路具有单向型的地方行走,我们想得到两点之间的路径和距离
1->5 10
1->2 2
2->5 7
2->3 3
3->1 3
3->4 4
4->5 5
5->3 3
现在,我们想要从1到达5的最短路径

    #include <stdio.h>
    int min =9999999 ; //预设距离最小值
    int book[101] ; //标记数组
    int e[101][101] ; //图
    int n ;//目标城市

    //先写一个DFS方法
    void dfs(int cur,int dis){
        int j ;

        //如果走过的路程已经大于了最短路径,那就直接返回,因为不可能是最短路径
        if(dis>min) return ; //其实这一步也让99999999代表正无穷成立
        if(cur == n)
        {
            //如果到达了目标城市
            if(dis<min)  min  = dfs ; //更新最小值
            return ;
        }

        for(j=1;j<=n;j++)
        {
            //判断路径
            if(e[cut][j] != 9999999 && book[j] = 0)
            {
                book[j] = 1 ; //mark
                dfs(j,dis+e[cur][j]) ; //继续搜寻
                book[j] = 0 ;//之后递归回来的时候清掉标记
            }
        }
        return ;
    }

        int main()
        {
            int i,j,m,a,b,c;
            scanf("%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] = 9999999 ;
                
            //读入城市之间的道路
            for(i=1;i<=m;i++)
            {
                scanf("%d %d %d",&a,&b,&c);
                e[a][b] = c ;
            }

            //从1号城市出发
            book[1] = 1 ;
            dfs(1,0) ; //1是当前城市编号,0是走过的路程

            printf("%d",min) ; 

            getchar();getchar();
            return 0 ;

        }

posted @ 2021-11-19 10:47  RetenQ  阅读(31)  评论(0编辑  收藏  举报