每日一题——求解连通分量个数

无向图连通分量计算
本文介绍了一种通过深度优先搜索(DFS)算法计算无向图连通分量数量的方法。首先,从键盘接收图的顶点集和关系集,创建无向图;然后,使用DFS遍历图,计算并输出连通分量个数。示例输入展示了6个顶点和7条边的情况,输出结果为2个连通分量。

题目描述
从键盘接收图的顶点集,关系集,创建无向图。
第一行依次输入图的顶点个数n,关系个数k,以空格隔开。顶点个数<=20
第二行依次输入顶点值,类型为字符。
接下去有k行,每行为两个字符 u 和 v,表示节点u 和 v 连通。格式为【uv】,中间不用空格间隔。
计算连通分量个数并输出。
输出一个整数,表示连通分量个数。

样例输入
6 7
ABCDEF
AB
AE
BC
CD
DA
DB
EC
样例输出
2

#include <iostream>
using namespace std;
#define MAX_VERTEX 20

int visited[MAX_VERTEX] = { 0 };
typedef struct {
	int vertexnum;
	int arcnum;
	int arcs[MAX_VERTEX][MAX_VERTEX];
	char vertex[MAX_VERTEX];
}AdjMatrix;

void creatGragh(AdjMatrix *G)
{
	//cout << "输入图的顶点数和边数:" << endl;
	cin >> G->vertexnum >> G->arcnum;

	//cout << "输入顶点信息:" << endl;
	for (int i = 1; i <= G->vertexnum; i++)
	{
		cin >> G->vertex[i];
	}

	for (int i = 1; i <= G->vertexnum; i++)
	{//初始化邻接矩阵
		for (int j = 1; j <= G->vertexnum; j++)
		{
			G->arcs[i][j] = 0;
		}
	}

	//cout << "输入头和尾结点:" << endl;
	for (int i = 0; i < G->arcnum; i++)
	{
		int head = 0; int tail = 0;
		char chead; char ctail;
		cin >> chead >> ctail;
		for (int j = 1; j <= G->vertexnum; j++)
		{
			if (G->vertex[j] == chead)
			{
				head = j;
				for (int k = 1; k <= G->vertexnum; k++)
				{
					if (G->vertex[k] == ctail)
						tail = k;
				}
			}
		}
		G->arcs[head][tail] = 1;
		G->arcs[tail][head] = 1;
	}

}

void DFS(AdjMatrix *G, int start)
{
	//cout << G->vertex[start];
	visited[start] = 1;
	for (int i = 1; i <= G->vertexnum; i++)
	{
		if (G->arcs[start][i] == 1 && visited[i] == 0)
			DFS(G, i);
	}
}

int DFSTraverse(AdjMatrix *G)
{
	int count = 0;
	for (int i = 1; i <= G->vertexnum; i++)
		visited[i] = 0;
	for (int i = 1; i <= G->vertexnum; i++)
	{
		if (!visited[i])
		{
			DFS(G, i);
			count++;
		}
	}
	return count;
}

int main() {
	AdjMatrix *G;
	G = (AdjMatrix*)malloc(sizeof(AdjMatrix));
	creatGragh(G);
	//showGragh(G);
	cout << DFSTraverse(G) << endl;
	return 0;
}

运行结果
2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值