zoukankan      html  css  js  c++  java
  • SDUT 1488 数据结构实验:连通分量个数

     

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

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    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

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

    Sample Input

    2
    3 1
    1 2
    3 2
    3 2
    1 2

    Sample Output

    2
    1

    提示:本题考查图的连通分量,用到了并查集的知识点。

    代码实现如下(g++):
    #include <bits/stdc++.h>
    
    using namespace std;
    
    int Map[110][110];
    int pre[110];
    int n,m;
    
    int find(int x)//查找结点
    {
        int r=x;
        while(pre[r]!=r)//如果该点的上级不是自身,则用递归将该点归到其上级的一类
            r=pre[r];
        int i=x,j;
        while(i!=r)//路径压缩
        {
            j=pre[i];//在改变上级之前用临时变量j记录下它的值
            pre[i]=r;//把上级变换
            i=j;
        }
        return r;
    }
    
    void join(int x,int y) //判断x y是否连通,如果已经连通,就不用管了,如果不连通,就把它们所在的连通分支合并起来
    {
        int fx=find(x),fy=find(y);
        if(fx!=fy)
        {
            pre[fx]=fy;
        }
    }
    
    int main()
    {
        int t,n,m,u,v,i,sum;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d",&n,&m);
            for(i=1;i<=n;i++)
            {
                pre[i]=i;
            }
            for(i=1;i<=m;i++)
            {
                scanf("%d %d",&u,&v);
                join(u,v);
            }
            sum=0;
            for(i=1;i<=n;i++)
            {
                if(pre[i]==i)
                {
                    sum++;
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    
    
    /***************************************************
    Result: Accepted
    Take time: 0ms
    Take Memory: 220KB
    ****************************************************/
  • 相关阅读:
    CentOS Linux使用crontab运行定时任务详解
    pycharm自定义代码片段
    迭代器:斐波那契数列
    mysql复习-来源考试
    复杂和遗留的数据库schema
    ubuntu系统AndroidStudio修改内存大小
    Hibernate设置时间戳的默认值和更新时间的自动更新
    Android 自定义view --圆形百分比(进度条)
    MYSQL 更新时间自动同步与创建时间默认值共存问题
    ubuntu virtualbox xp无声音解决
  • 原文地址:https://www.cnblogs.com/jkxsz2333/p/9506803.html
Copyright © 2011-2022 走看看