知识讲解:

图的遍历分为两种,深度遍历与广度遍历。这里讨论深度遍历。

以上图为例讨论图(图片来自《算法笔记》)的深度遍历:

设图形的顶点数为n。

先从顶点v0开始,用一个数组vis[n]来表示该顶点是否被访问,如果未被访问,vis[顶点编号]=0,否则为1.从v0开始访问,则vis[0]=1,v0可以连通v1与v2,即下一个访问的顶点是v1(遍历二维数组时1比2先访问到),再更新vis数组,然后再从v1访问v3,到v3时发现没有办法继续访问了,再退回上一个顶点v1(v1仍存在未被访问的岔道),从v1访问没有被访问过的v4,再从v4出发访问v5,到v5时无法再访问其余的顶点,回退至上一个存在未被访问岔道的顶点v0,访问未被访问的v2,至此所有顶点均被访问,遍历结束。

遍历要用递归实现;

代码实现:

int vis[1005],n;int a[1005][1005];void DFS(int v){vis[v]=1;//该顶点被访问for(int i=1;i<=n;i++){if(a[v][i]==1&&vis[i]==0)//与之有连接的点是否被访问过{DFS(i);}}}void DFSG(){for(int i=0;i<n;i++){if(vis[i]==0){DFS(i);}}}

例题研究:

1013 Battle Over Cities (25 分)

It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any other highways to keep the rest of the cities connected. Given the map of cities which have all the remaining highways marked, you are supposed to tell the number of highways need to be repaired, quickly.

Input Specification:
Each input file contains one test case. Each case starts with a line containing 3 numbers N (<1000), M and K, which are the total number of cities, the number of remaining highways, and the number of cities to be checked, respectively. Then M lines follow, each describes a highway by 2 integers, which are the numbers of the cities the highway connects. The cities are numbered from 1 to N. Finally there is a line containing K numbers, which represent the cities we concern.

Output Specification:
For each of the K cities, output in a line the number of highways need to be repaired if that city is lost.

Sample Input:
3 2 3
1 2
1 3
1 2 3

Sample Output:
1
0
0

来源网站:https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840

思路分析:

这道题的题意是,一个图如果删除一个顶点,添加几条边能保证其他点的联通。

先介绍概念连通体:连通体就是一个最大连通的子图(可以是一个点,两个相连的点)。

根据题意,我们需要讨论图要形成连通图的条件:假如某个图有n个连通体,v0,v1……vn,如果它们要连通,至少需要n-1条边相连,这里特别注意将整个连通体视作一个整体,也可以将其视为一整个顶点。

这道题可以先通过深度遍历找到连通体(深度遍历是在不断形成最大连通体),判断连通体的数量(即每次遍历到底后又回到有未访问岔口的顶点的时候计数器+1);需要添加的边就是连通体数量-1.这里需特别注意,删除一个点不能在图上真的删除它,只能在遍历到被删除的点时就返回。

代码实现:

#include <stdio.h>
#include <string.h>
int vis[1005],n,m,k,delet;
int a[1005][1005];
void DFS(int v){if(v==delet) return;vis[v]=1;for(int i=1;i<=n;i++){if(a[v][i]==1&&vis[i]==0){DFS(i);}}
}
int main()
{scanf("%d %d %d",&n,&m,&k);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){a[i][j]=-1;a[j][i]=-1;}}for(int i=0;i<m;i++){int x,y;scanf("%d %d",&x,&y);a[x][y]=1;a[y][x]=1;}while(k--){scanf("%d",&delet);int block=0;//vis[delet]=1;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){if(vis[i]==0&&i!=delet){DFS(i);block++;}}printf("%d\n",block-1);}return 0;
}

图的深度遍历 (邻接矩阵)相关推荐

  1. python来进行图的深度遍历和广度遍历

    python来进行图的深度遍历和广度遍历 # -*- coding: utf-8 -*- """ Created on Sat Sep 14 18:01:27 2019@ ...

  2. 图的深度遍历(邓俊辉版)

    文章目录 一.说在前面 二.代码实现和输出 一.说在前面 邓老师把图的边分成了4种:tree,backward,forward,cross.个人觉得,这样分的意义就在于对遍历树来说,原图的各条边各自有 ...

  3. 图的深度遍历和广度遍历算法

    图的深度遍历和广度遍历算法 图的深度遍历可以简单理解为一条道走到黑,首先访问图中任一起始顶点v,再访问与v顶点邻接且未被访问过的顶点w1,再访问与w1邻接且未被访问过的顶点w2,重复上述操作,若不能继 ...

  4. 图的深度遍历和广度遍历

    理论部分 图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历,如下面的图,可以用右边的邻接矩阵进行表示,假设以顶点0开始对整幅图进行遍历的话,两种遍历方式的思想如下: 1. 深度优先遍历 ...

  5. sdut 图的深度遍历

    图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 请定一个无向图 ...

  6. 【数据结构】图的深度遍历与广度遍历

    图是一种常见的数据格式,它的遍历主要分为两种: 深度优先遍历(DFS):类似于二叉树的前序前序遍历 广度优先遍历(BFS):类似于二叉树的层次遍历 一.出度与入度 在讲图的遍历之前,我们需要先了解图的 ...

  7. 实验报告C语言实现图的深度遍历,图的深度优先遍历的C语言实现.pdf

    图的深度优先遍历的C语言实现.pdf 维普资讯 九 江 职 业 技 术 学 院 学 报 JournalofJiujiangVocational&TechnicalCollege 2004.2 ...

  8. html递归遍历,图的深度遍历是一个递归过程

    数据结构问题:图的深度优先遍历中有递归的应用,数据结构问题:图的深度优先遍历中有递归的应用,要用到栈,图中顶点是首先你得明白函数调用本身就是通过栈来实现的. 调用函数是入栈,而函数返回是出栈. 为什么 ...

  9. 数据结构——图的深度遍历

    图的遍历方式有两种, 深度优先 广度优先 深度优先采用的是递归的方式来来实现,思想如下: 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点), **则深度优先遍历可定义如 ...

最新文章

  1. 又是逆袭!大四在校生 6 个月拿下京东美团滴滴等 Offer
  2. 下边框_OPPO Find X2颜值有多高?超窄下边框+瀑布屏,看完大写的服气
  3. 四 配置sshd与samba服务
  4. python文字识别库_python做文字识别一行代码都不用!
  5. PMP读书笔记(第4章)
  6. js 刷新页面window.location.reload();
  7. C.One Piece
  8. Spring3 MVC请求参数获取的几种场景
  9. c语言创建空顺序表的程序,用C语言编写一个完整的程序,实现顺序表的建立、插入、删除、输出等基本运算。...
  10. matlab 计算工时,C# + Matlab 实现计件工时拟合
  11. linux dns mx 记录,一起学DNS系列(十三)图文详说A、CNAME、MX和NS记录
  12. 演练 京东注册页面的制作 1009 HTML
  13. python123货币转换器_python货币转换
  14. centos6 yum源失效解决方法
  15. arcgis直方图工具在哪_这些分析工具都分不清?别说你懂数据分析!
  16. codeforces E. Sum of Digits
  17. 推荐最适合IT人自学的视频网站、社区网站
  18. 2019 CCCC 天梯赛 杭州站 历程
  19. 【每日早报】2019/07/31
  20. HDU——解题报告 1060

热门文章

  1. python123不能登录_最近教务系统升级了。。用 python 爬时, URL 被加密了无法操作模拟登陆...
  2. 如何用CDR“克隆”简单图形
  3. 电子音乐小知识——教你听懂电音
  4. iphonex验证服务器,【苹果iPhoneX评测】作死验证IP67到底靠不靠谱_手机评测-中关村在线...
  5. 智慧楼宇管理系统的功能和应用场景
  6. python中同时对多个字符进行替换_python同时替换多个字符串方法示例
  7. Java 自动装箱拆箱原理及避坑
  8. mysql修改密码(视频讲解+手把手教你)
  9. os.removedirs Directory not empty python
  10. 口碑最好的国产蓝牙耳机有哪些?国产蓝牙耳机品牌排行榜前十名