知识讲解:

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

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

设图形的顶点数为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;
}

  

图的深度遍历(C语言)邻接矩阵表示的更多相关文章

  1. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  2. SDUT 2107 图的深度遍历

    图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 请定一个无向图,顶点编号从0到 ...

  3. 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )

    图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...

  4. 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)

    题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...

  5. SDUT-2107_图的深度遍历

    数据结构实验之图论二:图的深度遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定一个无向图,顶点编号从0到n-1 ...

  6. 1047图的深度优先遍历c语言

    描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...

  7. 图的dfs遍历模板(邻接表和邻接矩阵存储)

    我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...

  8. 图的建立——邻接矩阵表示(C语言+VC6.0平台)

    图的邻接矩阵表示及其建立(无向图) #include <stdio.h> #include <stdlib.h> typedef char VertexType;        ...

  9. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

随机推荐

  1. 品味Spring Cache设计之美

    最近负责教育类产品的架构工作,两位研发同学建议:"团队封装的Redis客户端可否适配Spring Cache,这样加缓存就会方便多了" . 于是边查阅文档边实战,收获颇丰,写这篇文 ...

  2. vscode设置vue结构的初始代码片段

    { "Print to console": { "prefix": "vue", "body": [ "< ...

  3. 【Java】GUI实现贪吃蛇

    [Java]GUI实现贪吃蛇 前言 我们在做这个小游戏之前,得确保自己的AWT和Swing有一定的基础,并且会写一些简单的逻辑操作.这些都会在后面写的时候体现出来. 狂神老师从这里开始讲贪吃蛇的 我们 ...

  4. [µC/GUI 学习]µC/GUI移植

    一.什么是µC/GUI µC/GUI为任何需要图形显示器的嵌入式应用提供了一种灵活的图形用户界面(GUI).µC/GUI允许软件工程师在使用了LCD显示器的产品上增加美轮美奂的用户界面,从简单的2D黑 ...

  5. 程序员必备的编程助手!SmartCoder助你轻松集成HMS Core

    当开发者在集成HMS Core遇到一些疑问时,需要翻阅官网文档,反复查看集成说明或者API调用说明,或者研究GitHub上的开源示例代码,花费较多的时间,在IDE环境和网页浏览器之间反复切换也会耗费很 ...

  6. vue中$nextTick的使用

    转载 https://www.jb51.net/article/154823.htm  ,写的通俗易懂 在这里我有一个疑问,因为在vue中mounted里面执行后,dom节点是挂载上去了的,所以视图上 ...

  7. Casbin + Gin + Gorm 学习探索

    Casbin 是一个强大的,开源的访问控制框架,权限管理机制支持多种访问控制模型: 并且支持多种编程语言: 文档地址:https://casbin.org/docs/zh-CN/overview Gi ...

  8. (4)puppet常用的资源及其常用属性

    1.user资源就是用来管理目标服务器上的用户的,比如创建用户.修改用户.删除用户,user资源的常用属性如下 user{'test': ensure => present, uid => ...

  9. socket编程(struct报头)网络编程

    目录 一:socket编程 1.简介 2.参数说明: 3.socket套接字方法 4.socket编程思路: 二:socket套接字编程 1.socket简易版编程 2.通信循环 三:通信循环及代码优 ...

  10. spring 整合shiro框架 模拟登录控制器。

    一.导入shiro  jar包.  我在maven项目中,将常用的jar包都放在里面. <?xml version="1.0" encoding="UTF-8&qu ...