题目描述
从键盘接收图的顶点集,关系集,创建无向图。
第一行依次输入图的顶点个数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