题目描述

 在无向图中,如果从顶点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

提示

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct arcnode
{
    int adj;
}arcnode,adjmatrix[200][200];
typedef struct
{
    adjmatrix a;
    int vn;
    int an;
}MG;
int create(MG &g,int n,int m)//生成邻接矩阵;
{
    int i,j;
    int v1,v2;
    g.vn=n;
    g.an=m;
    for(i=1;i<=g.vn;i++)
        for(j=1;j<=g.vn;j++)
         g.a[i][j].adj=0;
    for(i=1;i<=g.an;i++)
    {
        scanf("%d%d",&v1,&v2);
        g.a[v1][v2].adj=1;
        g.a[v2][v1]=g.a[v1][v2];
    }
    return 1;
}
int v[110];//标记图的顶点是否访问过;
void dfs(MG &g,int i)//深度优先搜索;
{
    int j;//j在函数内部,不然不能回溯;
    v[i]=1;
    for(j=1;j<=g.vn;j++)
        if(g.a[i][j].adj==1&&!v[j])
    {
        dfs(g,j);
    }
}
int i,count;//记录连通分量个数;
void dfs1(MG &g)//统计连通分量的个数
{
    //int i;//若不在函数内部不会回溯;
    for(i=1;i<=g.vn;i++)
        if(!v[i])
    {
        count++;
        dfs(g,i);
    }
}
int main()
{
    int t;
    MG g;
    scanf("%d",&t);
    while(t--)
    {
        count=0;
        memset(v,0,sizeof(v));//标记数组初始化;
        int n,m;
        scanf("%d%d",&n,&m);
        create(g,n,m);
        dfs1(g);
        printf("%d\n",count);
    }
    return 0;
}

#include <cstdio>
#define MAX 2000
using namespace std;int pre[MAX+1];void Initialize(int n) {        // 初始化各结点的 pre 为自身for(int i=0; i<=n; ++i) {  // 相当于初始时每个结点为各自独立的集合pre[i] = i;}
}int Find(int a) {              // 查找 a 所在集合的根结点 rootint root = a;             // root 初始化为其本身while(pre[root] != root) {  // 当 root 的上级结点不是其本身root = pre[root];      // 令 root 为它的上级结点,继续查找}while(pre[a] != root) {      // 再次遍历,路径压缩int temp = pre[a];pre[a] = root;           // 沿途结点直接指向到 roota = temp;}return root;
}void Join(int a, int b) {      // 将 a, b 结点所在的集合合并int root_a = Find(a);       // 查找 a 所在集合的根结点int root_b = Find(b);      // 查找 b 所在集合的根结点if(root_a != root_b) {     // 如果 a, b 不在同一集合,则合并if(root_a > root_b)      // 根结点下标大的集合并入下标小的集合pre[root_a] = root_b;else pre[root_b] = root_a;}
}int Count(int n) {             // 统计不相交集合的个数int cnt = 0;              // 计数变量for(int i=1; i<=n; ++i) {int root = Find(i);     // 找到一个集合if(root) {             // 如果是第一次找到此集合cnt++;              // 计数pre[root] = 0;        // 此根节点置0,防止重复}}return cnt;
}int main(int argc, char const *argv[]) {int t, n, m, u, v;scanf("%d", &t);while(t--) {scanf("%d %d", &n, &m);Initialize(n);while(m--) {scanf("%d %d", &u, &v);Join(u, v);}printf("%d\n", Count(n));}return 0;
}

数据结构实验:连通分量个数相关推荐

  1. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  2. SDUT OJ 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  3. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  4. sdut 2135 数据结构实验之队列一:排队买饭

    数据结构实验之队列一:排队买饭 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...

  5. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)

    数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...

  6. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)

    数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...

  7. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除

    提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...

  8. SDUT—2054数据结构实验之链表九:双向链表 (基本建立)

    点击打开链接 数据结构实验之链表九:双向链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Des ...

  9. SDUT_2121数据结构实验之链表六:有序链表的建立 (对建立的单项链表结构进行排序)

    点击打开链接 数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

最新文章

  1. nowcoder119E A Simple Problem
  2. android studio编译JNI问题ninja: fatal: couldn‘t open nul的解决
  3. volatile用法
  4. android 查询wifi信息的类,Android 获取wifi信息
  5. angular监听输入框值的变化_如何检测Angular中@Input()值何时发生变化?
  6. SpringBoot项目读取json配置文件
  7. 计算机控制机器人运动的原理,工业机器人控制系统的基本原理
  8. 计算机显示器出现黑屏分析
  9. 百度小程序怎么添加到主屏幕将百度小程序放到手机桌面?
  10. 上采样,重采样和下采样,降采样
  11. mybatis-plus使用注意事项
  12. CSP CCF: 201909-3 字符画) (C++)
  13. mac机c4d更改语言,Win/Mac版:C4D R18 三维软件 Cinema 4D C4D R18 正式完整版 + 中文/英文注册机版...
  14. 新硬盘怎么装系统分区?
  15. mpc 安全多方计算协议_一文揭秘跨链、密钥管理、合约隐私背后的技术, 你不可不知的安全多方计算(MPC)...
  16. 海外IT工程师工作福利揭秘
  17. MES系统供应商评估报告-- Gartner出品
  18. html:对于拼多多网页的简单制作
  19. 云原生尝试——Docker部署node项目
  20. 求职应聘时面试常见问题1

热门文章

  1. php 分布式数据库查询,分布式数据库
  2. python的作者为什么要创造python_为什么要学习Python?老男孩Python开发
  3. oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
  4. jdba访问mysql_mysql连接出现问题记录
  5. can通道采样频率_CAN采样点设置为多少合适?设置不对会咋样?
  6. golang atomic load 性能_设计模式之Golang单例模式
  7. vfp操作excel排序_中招计算机信息技术考试训练|Excel操作题一|排序和筛选
  8. php按数字分页类,PHP简单实现数字分页功能示例
  9. PPT下载下来是php,用php下载jpg,doc,ppt文件已损坏
  10. java 开发帮助_java的简单编程请帮助