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

题目描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何优化简历

http://mp.weixin.qq.com/s?__bizMzAxMzUzNzYyNA&mid402350492&idx1&sn0e180c05248c845d6ed3e43f5006679e#rd

网络编程之 application/x-www-form-urlencoded MIME编码

编码作用&#xff1a; https://baike.baidu.com/item/魏杰/15581?fraladdin如果我们想要这种表单提交中链接的中文信息不显示出来&#xff0c;那么我们就需要通过MIME编码把中文转换成另外一种编码显示出来,但是这种编码在国内的浏览器中运用的并不多&#xff0c;谷歌浏览器用…

数据结构实验之图论八:欧拉回路

题目描述 在哥尼斯堡的一个公园里&#xff0c;有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。 能否走过这样的七座桥&#xff0c;并且每桥只走一次&#xff1f;瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究&#xff0c;不仅圆满地回答…

Linux面试相关

1.TCP/IP 建立连接的过程&#xff1f;&#xff08;3-way shake&#xff09; Client与server建立TCP连接时&#xff1a;首先Client向server发SYN&#xff08;请求&#xff09;&#xff0c;然后server回复&#xff08;应答请求&#xff09;&#xff0c;最后Client回复&#xff0c…

网络编程之 传输层的协议TCP与UDP

传输层协议: TCP和UDP的区别: TCP&#xff1a;面向连接(经历三次握手)、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢&#xff0c;建立连接需要开销较多(时间&#xff0c;系统资源)。 服务端和客户端 UDP&#xff1a;面向非连接、传输不可靠(丢…

n a^o7 !

题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and happiness. If you want to win the battle, you must do warm-up according to my instructions, which can make you in the best state prep…

socket阻塞与非阻塞,同步与异步

转自&#xff1a;http://blog.csdn.net/hguisu/article/details/7453390 socket阻塞与非阻塞&#xff0c;同步与异步 作者&#xff1a;huangguisu 1. 概念理解 在进行网络编程时&#xff0c;我们常常见到同步(Sync)/异步(Async)&#xff0c;阻塞(Block)/非阻塞(Unblock)四种调…

网络编程之如何通过URL获取网页代码

java.net 类 URL java.lang.Objectjava.net.URL所有已实现的接口&#xff1a; Serializable public final class URLextends Objectimplements Serializable类 URL 代表一个统一资源定位符&#xff0c;它是指向互联网“资源”的指针。资源可以是简单的文件或目录&#xff0c;…

数据结构实验之图论七:驴友计划

题目描述 做为一个资深驴友&#xff0c;小新有一张珍藏的自驾游线路图&#xff0c;图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况&#xff0c;现在请你编写一个程序&#xff0c;找出一条出发地到目的地之间的最短路径&#xff0c;如果有多条路径最短&#xff…

Windows完成端口(IOCP)

http://blog.csdn.net/piggyxp/article/details/6922277

图结构练习——最小生成树

题目描述 有n个城市&#xff0c;其中有些城市之间可以修建公路&#xff0c;修建不同的公路费用是不同的。现在我们想知道&#xff0c;最少花多少钱修公路可以将所有的城市连在一起&#xff0c;使在任意一城市出发&#xff0c;可以到达其他任意的城市。 输入 输入包含多组数据&a…

Windows 中_T和L

_T("")是一个宏&#xff0c;定义于tchar.h下。[1]&#xfeff; #define _T(x) _ _T(x)   #ifdef _UNICODE #define _ _T(x) L ## x #else /* ndef _UNICODE */ #define _ _T(x) x 他的作用是让你的程序支持Unicode编码 因为Windows使用两种字符集ANSI和UN…

多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的线程唤醒该线程. notify:执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待. notif…

数据结构实验之图论六:村村通公路

题目描述 当前农村公路建设正如火如荼的展开&#xff0c;某乡镇政府决定实现村村通公路&#xff0c;工程师现有各个村落之间的原始道路统计数据表&#xff0c;表中列出了各村之间可以建设公路的若干条道路的成本&#xff0c;你的任务是根据给出的数据表&#xff0c;求使得每个村…

技术人生“白天求生存,晚上谋发展”

白天求生存&#xff0c;晚上谋发展 这句话最近在团队经常有人说&#xff0c;其实我也深有体会&#xff0c;因为我看到的技术牛人他们背后肯定有一段很长时间的艰苦时光&#xff0c;可能是3年&#xff0c;也可能是8年&#xff0c;也可能一直还在坚持。 其实我们周围大部份人有一…

CRT

当C Runtime函数库于20世纪70年代产生出来时&#xff0c;PC的内存容量还很小,多任务是个新奇观念&#xff0c;更别提什么多线程了。因此以当时产品为基础所演化的C Runtime函数库在多线程&#xff08;multithreaded&#xff09;的表现上有严重问题&#xff0c;无法被多线程程序…

java多线程笔记补充之线程的生命周期

多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. 避免死锁法则: 当多个线程都要访问共享的资源A,B,C时,保证每一个线程都按照…

图结构练习——BFSDFS——判断可达性

题目描述 在古老的魔兽传说中&#xff0c;有两个军团&#xff0c;一个叫天灾&#xff0c;一个叫近卫。在他们所在的地域&#xff0c;有n个隘口&#xff0c;编号为1..n&#xff0c;某些隘口之间是有通道连接的。其中近卫军团在1号隘口&#xff0c;天灾军团在n号隘口。某一天&…

关于跨dll的模板单例问题

C的模板可以帮助我们编写适合不同类型的模板类&#xff0c;给代码的复用性提供了极大的方便。近来写了一个涉及单例的C模板类&#xff0c;简化下来可以归结为以下的代码&#xff1a; 1234567891011template <typename T>class Singleton{public:// 此处省去了多线程安全锁…