图的深度遍历(C语言)邻接矩阵表示
知识讲解:
图的遍历分为两种,深度遍历与广度遍历。这里讨论深度遍历。
以上图为例讨论图(图片来自《算法笔记》)的深度遍历:
设图形的顶点数为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语言)邻接矩阵表示的更多相关文章
- 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...
- SDUT 2107 图的深度遍历
图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 请定一个无向图,顶点编号从0到 ...
- 数据结构之 图论---图的深度遍历( 输出dfs的先后遍历序列 )
图的深度遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出.遍历时,先遍历节点编 ...
- 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)
题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...
- SDUT-2107_图的深度遍历
数据结构实验之图论二:图的深度遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定一个无向图,顶点编号从0到n-1 ...
- 1047图的深度优先遍历c语言
描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...
- 图的dfs遍历模板(邻接表和邻接矩阵存储)
我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...
- 图的建立——邻接矩阵表示(C语言+VC6.0平台)
图的邻接矩阵表示及其建立(无向图) #include <stdio.h> #include <stdlib.h> typedef char VertexType; ...
- 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)
1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...
随机推荐
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- 【刷题-LeetCode】304. Range Sum Query 2D - Immutable
Range Sum Query 2D - Immutable Given a 2D matrix matrix, find the sum of the elements inside the rec ...
- Qt之QFileDialog
widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QString> class W ...
- gin中绑定uri
package main import ( "github.com/gin-gonic/gin" "net/http" ) type Person struct ...
- 从服务端生成Excel电子表格(Node.js+SpreadJS)
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,通常用于创建网络应用程序.它可以同时处理多个连接,并且不像其他大多数模型那样依赖线程. 对于 Web 开发者来说,从数据库 ...
- springboot 配置百里香 thymeleaf?
一.1.1父级工程导入jar包. springboot已经完整把thymeleaf集成进框架中了,可以直接添加使用不需要任何的配置信息 <dependency> <groupId&g ...
- 如何在pyqt中实现丝滑滚动字幕
滚动字幕的视觉效果 网上有很多博客介绍了滚动字幕的实现方法,懂得都懂,大部是 Ctrl C + Ctrl V,效果还很差,最后还是得靠自己.主要思路就是通过定时器定时刷新+绘制两段完整的字符串来达到 ...
- X000010
P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意:求 \({\rm S}(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm} ...
- argc 和 argv
转载请注明来源:https://www.cnblogs.com/hookjc/ 如果用C寫一般的命令列工具,常透過main函式的argc,argv來取得使用者所輸入的命令參數.int main(int ...
- 自定义的类实现copy操作
1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...