图的基本操作、算法和应用

7-1 判断两点之间是否存在路径

本题要求输出两个顶点之间是否存在路径

输入格式:输入包括两部分,第一部分是邻接矩阵表示方法中对应1的两个顶点,用0 0 表示结束
第二部分是两个顶点,例如 Vi和Vj

输出格式:如果Vi和Vj存在路径,输出1;否则输出0

我们的输入是邻接矩阵,因此只用比较这个二维数组内部的数据就可。vi与vj之间存在路径是一个双向的,因此第i行在检查的时候只用检查i列就可,相当于只检查了矩阵的下三角,这样可以减小检查次数。当发现两个结点之间有路径时,输出为1;,否则为0

7-2 判断一个有向图是否存在回路

本题要求编程判断一个有向图是否存在回路

输入格式:输入是有向图的邻接矩阵表示中的1的相邻顶点,以-1 -1 结束

输出格式:如果存在回路,输出1,否则输出0

首先利用DFS进行拓扑排序,最后生成一个拓扑序链表,然后为每个节点设置一个是否被访问过标记,用Visit数组

遍历这个链表,对每个节点v,设置visit[v]=1,如果判断如果存在与该节点相邻的节点u,使得Visit[u]=1,那么证明存在回边,这图中一定存在回路

7-3 计算最小生成树权值

本题要求采用prim算法求最小生成树,输出其权值之和

输入格式:输入为顶点 顶点 权值,以 0 0 0表示结束

输出格式:输出为最小生成树的权值大小

从连通网络N = { V, E }中的某一顶点u0出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。如此重复执行,直到网络中的所有顶点都加入到生成树顶点集合U中为止。 假设G=(V,E)是一个具有n个顶点的带权无向连通图,T(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集初始状态,TE为空,U={v0},v0∈V在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u′,v′)并入TE,同时将v′并入U重复执行步骤(2)n-1次,直到U=V为止。

7-4 求一个顶点到其他顶点的最短路径

本题要求计算一个顶点v0到其他顶点的最短路径,并输出该路径

输入格式:输入为顶点 顶点 权值,以 0 0 0表示输入结束

输出格式:输出为v0到其他各个顶点的最短路径长度和路径

先选定一个结点为根结点,并选定一个数组,先确定未遍历前的初始距离,把距离最短的邻接结点选定为中间结点,并标记访问过,开始往下遍历,挨个访问那个中间结点的邻接结点。计算出根结点到中间结点中间结点到新邻接结点的距离,作为新距离,对比新距离和旧距离,如果新距离大,则把新距离替换掉旧距离,否则不变。一轮访问结束后,从未标记的结点中选定距离最短的,把它作为中间结点,继续往下访问。若都标记过,则算法结束。

7-5 判断一个有向图是否能够完成拓扑排序

本题要求输出一个有向图是否能够完成拓扑排序,要求图采用邻接表表示

输入格式:输入为 顶点vi 顶点vj ,表示vj邻接于vi;以-1 -1 表示输入结束
注意邻接表建立时采用头插法创建

输出格式:如果能够完成拓扑排序输出1,否则输出0

在有向图中选择一个没有前驱(入度为0)的顶点输出;从图中删除该顶点和所有以它为尾的弧;重复两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。若所有顶点都被输出,则说明原有向图中没有回路;否则,说明有回路。

7-6 选取医院建立的位置

设a、b、c、d、e、f表示一个乡的6个村庄,弧上的权值表 示两村之间的距离。现要在这6个村庄中选择一个村庄建一所医院,问医院建在哪个村庄 才能使离医院最远的村庄到医院的距离最短?

按照顺序依次令这六个村庄为根节点,分别利用上方7-4的方法计算每一个根节点情况下的最短路径,并把最远路径的权值用链表记录,链表结点中包含根节点的标号、最远村庄的标号、最远权值以及指针。然后顺序比较权值大小,找到最小权值,并输出医院所在村庄编号

7-7 迷宫变种-最短路径

下面图示表示一个迷宫,四周为-1表示围墙,内部为-1表示障碍,权 值1、2、5、9表示经过需要消耗的能量代价。请找出从入口(3,6)到出口(8,8),老鼠消耗能量最小的路径(注意本题是四个方向的迷宫)

输入格式:

第一行:迷宫的大小m n ,分别表示迷宫的长和高
第二行:入口和出口
其余行:迷宫的矩阵表示
提示:用65535为无穷大

输出格式:输出为老鼠消耗能量最小的路径,以逆序输出

利用迷宫的广度搜索:

1.创建两个空队列LinkQueueX和LinkQueueX

2.将入口entreX和entryY分别压入队列LinkQueueX和LinkQueueX。

3.当队列不空

①取队头元素,出队

②for(mov=0;mov<4;mov++),即还存在可以探索的相邻的方向。

a.按照顺时针依次探索各个位置(X,Y)。

b.如果(posX,posY)是出口,则输出路径,返回。

c.如果(posX,posY)是没有走过的通路;

设置标志位mark[posX][posY]=1。当前位置入队。记录前驱位置,方便输出路径。

创建一个计数值count每次走过一个位置count就加上其对应的值,并建立一个链表,走完全程后就将走过的路径写入,然后计算下一个路径的count,比较两个count,如果上一个的值小,第二个不用将路径写入,直接计算下一个路径的count;r如果上一个的值大,保留第二个的链表,并将第一个释放,直至将所有路径全部走完,输出count最小的路径。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值