编写算法求无向图的连通分量的个数,求无向图的连通分量
利用深度遍历算法实现
int getNum(MGraph G) {
int i, count = 0;
for(i = 0; i < G.vexnum; i++)
visited[i] = false;
for(i = 0; i < G.vexnum; i++)
if(!visited[i]) {
count++;
DFS(G, i);
}
return count;
}
测试代码如下:
以下代码以邻接表作为图的存储方式
#include
#include
#define MAXVEX 10
typedef int VertexType;
typedef struct arcNode {
int adjvex;
struct arcNode *next;
} arcNode;
typedef struct vertexNode {
VertexType data;
arcNode *first;
} vertexNode, adjList[MAXVEX];
typedef struct {
adjList adjlist;
int vexnum, arcnum;
} ALGraph;
//邻接表初始化
void createALGraph(ALGraph &G) {
int i, j, k;
arcNode *e;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
for(i = 0; i < G.vexnum; i++) {
scanf("%d", &G.adjlist[i].data);
G.adjlist[i].first = NULL;
}
for(k = 0; k < G.arcnum; k++) {
printf("输入边(vi, vj)上的顶点序号:\n");
scanf("%d%d", &i, &j);
e = (arcNode *)malloc(sizeof(arcNode));
e->adjvex = i;
e->next = G.adjlist[j].first;
G.adjlist[j].first = e;
e = (arcNode *)malloc(sizeof(arcNode));
e->adjvex = j;
e->next = G.adjlist[i].first;
G.adjlist[i].first = e;
}
}
//深度优先遍历
int visited[MAXVEX];
void DFS(ALGraph G, int i) {
arcNode *p;
visited[i] = 1;
p = G.adjlist[i].first;
while(p) {
if(!visited[p->adjvex])
DFS(G, p->adjvex);
p = p->next;
}
}
//求连通分量
int getNum(ALGraph G) {
int i, count = 0; //记录连通分量个数
for(i = 0; i < G.vexnum; i++)
visited[i] = 0;
for(i = 0; i < G.vexnum; i++)
if(!visited[i]) {
count++;
DFS(G, i);
}
return count;
}
int main() {
ALGraph G;
createALGraph(G);
printf("%d", getNum(G));
return 0;
}
编写算法求无向图的连通分量的个数,求无向图的连通分量相关推荐
- 【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
应用一 设计算法以求解无向图G的连通分量的个数 图示: 深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=fi ...
- 用c语言求1 n的素数个数 给出两种解法,【题目】求n以内的素数个数
最近在leetCode上刷提,还是满锻炼人的,为以后面试打基础吧.不多说下面开始. 问题:求[2,n]之间的素数的个数. 来源:leetCode OJ 提示: Let's start with a i ...
- 算法笔记--无向图的桥、割点、边双连通分量和点双连通分量
概念: 桥:无向图中删去一条边使得图不再联通,则这条边称为桥 割点:无向图中删去一个点使得图不再联通,则这个点称为割点 算法: 运用到tarjan算法 关于tarjan算法: https://www. ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E) 割点: 对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点 割边(桥) 若对于e∈E,从图中删去边e之 ...
- [算法] 求排列组合: 从n个数中任选m个数组成一个新数
#include <iostream> #include <vector>using namespace std;// 求排列组合算法: C(n, m): 从n个数中任选m个数 ...
- 用java提示用户输入学生个数_编写程序,提示用户输入一个数N,然后显示1~N的所有偶数平方值,求大神看看我写的程序哪里有问题。。...
点击查看编写程序,提示用户输入一个数N,然后显示1~N的所有偶数平方值,求大神看看我写的程序哪里有问题..具体信息 答: 修改后的程序:#includeint main(){int n,a,b;pri ...
- 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数
所谓Population Count算法,即是指计算一个二进制数中1的个数的算法.具体来说,就是任意给定一个无符号整数N,求N的二进制表示中1的个数,比如N = 5(0101)时,返回2:N = 15 ...
- 20.编写函数int fun(int lim,int aa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求出的素数的个数。
20.编写函数int fun(int lim,int aa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求出的素数的个数. 效果 代码 #include &l ...
- 求二进制数中1的个数(转)
2.1 求二进制数中1的个数 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 分析与解法 大多数的读者都会有这样的反应:这个题目也太简 ...
最新文章
- Android studio断开svn连接
- Android Realm相关操作
- 字符数组、字节数组、字符串转换
- loadruner11 socket脚本-10053错误
- 分布式Redis的分布式锁 Redlock
- freecodecamp_freeCodeCamp.org隐私权政策:问题与解答
- trc20地址监听php,Tron/USDT-TRC20对接PHP开发包 - 人人都是架构师
- SpringMVC 入门示例讲解
- matlab中使用libsvm工具箱训练的svm分类器model保存
- 指针变量本质(四十三)
- 我的世界服务器修改地图,《我的世界手机版》地图编辑器介绍 怎么修改地图信息...
- OpenCV4--->基础函数,与操作
- html特效字体在线生成,javascript实现鼠标点击生成文字特效
- 【Operator】七大互联网电视牌照商2016年下半年动向之中央三大台
- 摄影后期人像高端摄影后期PS修图技巧
- pubwin修改服务器时间,如何解决控制台打开(Pubwin)提示服务器没有启动或者服务器IP地址改变问题...
- 二度理解Java web中的核心知识
- 如何在OUTLOOK签名中自动加入日期
- 直角三角形面积Java_利用Eclipse编写第一个简单的Java程序,实现如下功能。 键盘输入:直角三角形两直角边a, b,根据勾股定理计算斜边的平方值。并输出。 例如:运行效果如下...
- Canvas--画直线