您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验:连通分量个数

2016-08-16 16:44 211 查看



数据结构实验:连通分量个数



Time Limit: 1000MS Memory limit: 65536K

题目描述

在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图,
否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大。
例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量。

输入

第一行是一个整数T,表示有T组测试样例(0 < T <= 50)。每个测试样例开始一行包括两个整数N,M,(0 < N <= 20,0 <= M <= 200)
分别代表N个顶点,和M条边。下面的M行,每行有两个整数u,v,顶点u和顶点v相连。

输出

每行一个整数,连通分量个数。

示例输入

2
3 1
1 2
3 2
3 2
1 2


示例输出

2
1


提示

来源

cz

示例程序

提交

状态

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef int Status;
Status (*VisitFunc)(int v);
typedef struct
{
int arcs[MAX][MAX];
int vexnum,arcnum;
}Graph;
Status visited[MAX],count,begin;
Status CreatUDG(Graph *G)
{
int i,j,k,v1,v2;
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++)
for(j=1;j<=G->vexnum;j++)
G->arcs[i][j]=0;
for(k=1;k<=G->arcnum;k++)
{
scanf("%d%d",&v1,&v2);
G->arcs[v1][v2]=1;
G->arcs[v2][v1]=1;
}
return 1;
}
int visiT(int v)
{
return 1;
}
void DFS(Graph G,int v)
{
int w;
visited[v]=1;VisitFunc(v);
for(w=1;w<=G.vexnum;w++)
if(!visited[w]&&G.arcs[v][w])
DFS(G,w);
}
void DFSTraverse(Graph G,Status(*Visit)(int v))
{
int v;
VisitFunc=Visit;
for(v=1;v<=G.vexnum;v++)visited[v]=0;
for(v=1;v<=G.vexnum;v++)
if(!visited[v])
{DFS(G,v);count++;}
}
int main()
{
int n;
Graph G;
scanf("%d",&n);
while(n--)
{
count=0;
CreatUDG(&G);
DFSTraverse(G,visiT);
printf("%d\n",count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: