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

来源:互联网 发布:c语言编译器哪个好 编辑:程序博客网 时间:2024/05/16 08:43

Problem Description

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

例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量。

Input

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

Output

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

Example Input

2
3 1
1 2
3 2
3 2
1 2

Example Output

2
1

最小生成树问题

#include <iostream>#include <cstdio>#include <cstring>#define MAX 20005using namespace std;int f[200];int n,m;struct node{    int u;    int v;    int w;}e[505];int find(int p){    if(p == f[p])        return p;    else        return f[p] = find(f[p]);}int join(int v,int u){   int t1,t2;   t1 = find(v);   t2 = find(u);   if(t1 != t2)   {       f[t2] = t1;       return 1;   }   return 0;}int main(){    int T;    int i;    scanf("%d",&T);    while(T--)    {        int count = 0,num = 0;        scanf("%d%d",&n,&m);        for(i=1;i<=m;i++)        {            scanf("%d%d",&e[i].u,&e[i].v);            e[i].w = 1;        }        for(i=1;i<=n;i++)            f[i] = i;        for(i=1;i<=m;i++)        {            if(join(e[i].u,e[i].v))                count ++;        }        for(i=1;i<=n;i++)        {            if(f[i] == i)                num++;        }        printf("%d\n",num);        /*for(i=1;i<=n;i++)            printf("%d ",f[i]);        printf("\n");*/    }    return 0;}
原创粉丝点击