判断邻接矩阵存储的图是否为连通图

用深度优先搜索判断

typedef struct
{
	char vex[Max];
	int arc[Max][Max];
	int vexnum,arcnum;
}MGraph;
bool visited[Max];
bool Judge(MGraph G)
{
	for(int v=0,v<G.vexnum,v++)
	{
		visited[v]=false;
	}
	DFS(G,0);
	for(int v=0;v<G.vexnum;v++)
		if(!visited[v])
			return false;
	return true;
}
void DFS(MGraph G,int v)
{
	visited[v]=true;
	for(w=FistNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
	{
		if(!visited[w])
			DFS(G,w);
	}
}
	

 

邻接矩阵是一种存储的方式,可以用一个二维数组表示的连接情况。对于一个无向,如果i和j之间有边相连,则邻接矩阵中的第i行第j列和第j行第i列都为1,否则为0。对于一个有向,如果从i到j有一条有向边,则邻接矩阵中的第i行第j列为1,否则为0。 判断无向是否连通,可以使用深度优先遍历或广度优先遍历。具体思路是:从任意一个节点开始遍历整个,如果能够遍历到所有节点,则说明该无向连通的。 以下是使用深度优先遍历来实现判断无向连通性的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 typedef struct { int vertex[MAX_VERTEX_NUM]; // 存放顶点的数组 int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存放边的邻接矩阵 int vertex_num; // 顶点数 int edge_num; // 边数 } Graph; int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过 void dfs(Graph G, int v) { visited[v] = 1; // 标记节点v已经被访问过 for (int i = 0; i < G.vertex_num; i++) { if (G.edge[v][i] && !visited[i]) { // 如果v和i之间有边相连且i未被访问过 dfs(G, i); // 递归访问节点i } } } int is_connected(Graph G) { for (int i = 0; i < G.vertex_num; i++) { visited[i] = 0; // 初始化visited数组 } dfs(G, 0); // 从任意一个节点开始遍历 for (int i = 0; i < G.vertex_num; i++) { if (!visited[i]) { // 如果存在未被访问的节点,则说明该无向连通 return 0; } } return 1; // 否则说明该无向连通的 } int main() { Graph G; scanf("%d %d", &G.vertex_num, &G.edge_num); for (int i = 0; i < G.vertex_num; i++) { scanf("%d", &G.vertex[i]); } for (int i = 0; i < G.vertex_num; i++) { for (int j = 0; j < G.vertex_num; j++) { G.edge[i][j] = 0; // 初始化邻接矩阵 } } for (int i = 0; i < G.edge_num; i++) { int u, v; scanf("%d %d", &u, &v); G.edge[u][v] = G.edge[v][u] = 1; // 无向的边是双向的,因此需要同时设置i和j之间的边 } if (is_connected(G)) { printf("The graph is connected.\n"); } else { printf("The graph is not connected.\n"); } return 0; } ``` 对于有向连通判断,可以使用类似的方法,只需要将深度优先遍历改为拓扑排序即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值