标题
求无向图连通子图
时间限制
2 S
内存限制
10000 Kb
问题描述
求无向图连通子图个数
问题输入
测试数据由m+1行构成,第一行为两个正整数n(1<n<=30)和m(1<m<100),分别表示顶点数(顶点编号为1,2,…,n)和边数,其后是m行数据,每行数据是一条边的信息,包括两个数字,分别表示该边关联的两个顶点。
问题输出
输出两行信息,第一行输出该图中连通子图的个数。第二行按照升序输出每个连通子图中顶点个数。
输入样例
9 8
1 2
1 3
2 4
3 4
5 7
5 6
6 7
8 9
输出样例
3
2 3 4
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void DFS(int arcs[50][50], int visited[50], int v, int i, int* count);
void Bubble(int count_v[50], int n);
int main()
{
int v, e;
int i, j, k;
int arcs[50][50] = { 0 };//邻接矩阵
int count_m = 0;//连通子图个数
int count_v[50] = { 0 };//结点数组
int visited[50] = { 0 };//标志数组
scanf("%d %d", &v, &e);
for (i = 0; i < e; i++)//构造邻接矩阵
{
scanf("%d %d", &j, &k);
arcs[j][k] = 1;
arcs[k][j] = 1;
}
j = 0;
for (i = 1; i <= v; i++)
{
if (visited[i] == 0)
{
DFS(arcs, visited, v, i, &count_v[j]);
j++;
count_m++;
}
}
Bubble(count_v, j);//冒泡排序
printf("%d\n", count_m);
for (i = 0; count_v[i] != 0; i++)
{
printf("%d ", count_v[i]);
}
return 0;
}
void DFS(int arcs[50][50], int visited[50], int v, int i, int* count)//邻接矩阵, 标志数组, 结点总数, 结点序号, 计数器
{
int j;
if(visited[i] == 0)
{
visited[i] = 1;
(*count)++;//记录连通子图中的结点个数
for (j = 1; j <= v; j++)
{
if (arcs[i][j] == 1)//找该结点邻接的下一个未别访问的结点;
{
DFS(arcs, visited, v, j, count);
}
}
}
}
void Bubble(int count_v[50], int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (count_v[j] > count_v[j + 1])
{
int t = count_v[j];
count_v[j] = count_v[j + 1];
count_v[j + 1] = t;
}
}
}
}