求连通分量

ssl 1759

题目大意

由n个点组成的无向图,求连通在一起的点数最大是多少


原题

求一个图的连通分量

Input

n 顶点数(<=100)

Output

连通分量

Sample Input

8

6 3

1 2

2 5

5 4

4 1

8 7

0 0

Sample Output

4


方法一(dfs 邻接矩阵)

用邻接矩阵的方法来存,再用dfs,要判断到过没

#include<cstdio>
#include<iostream>
using namespace std;
int n,x,y,a[101][101],ans;
bool p[101];
int dfs(int now)
{int t=1;//自身p[now]=1;//记录for (int i=1;i<=n;i++)if ((!p[i])&&(a[now][i]))//到过未,连不连通t+=dfs(i);//累加return t;
}
int main()
{scanf("%d%d%d",&n,&x,&y);while(x&&y){a[x][y]=1;a[y][x]=1;//正反都要scanf("%d%d",&x,&y);}for (int i=1;i<=n;i++)if (!p[i])ans=max(ans,dfs(i));//求总值printf("%d",ans);
}

方法二(dfs 邻接表)

用dfs,但是用链表的方法存,搜索时就省了很多时间

#include<cstdio>
#include<iostream>
using namespace std;
int s[101],n,x,y,ans,w;
bool p[101];
struct rec
{int ss,next;//ss为连接的数,next和同一个点的另一条线
}a[10005];
int dfs(int now)
{int t=1;//自身p[now]=1;//已走过for (int i=s[now];i;i=a[i].next)//以now为起点的所有边if (!p[a[i].ss]) t+=dfs(a[i].ss);//判断到过没,没到过就去return t;
}
int main()
{scanf("%d%d%d",&n,&x,&y);while (x&&y){a[++w].ss=y;//下一个数a[w].next=s[x];//下一条边s[x]=w;//替换a[++w].ss=x;//反过来,做一遍(无向)a[w].next=s[y];s[y]=w;scanf("%d%d",&x,&y);}for (int i=1;i<=n;i++)if (!p[i])ans=max(ans,dfs(i));//求最大值printf("%d",ans);
}

方法三(bfs 邻接矩阵)

同样是用邻接矩阵,但用bfs,从每一个位置开始,结果为队列的长度

**#include<cstdio>
#include<iostream>
using namespace std;
int n,x,y,a[101][101],p[101],d[101],ans;
int bfs(int x)
{int head=0,tail=1;d[1]=x;//入队p[x]=1;//记录do{head++;for (int i=1;i<=n;i++)if ((!p[i])&&(a[d[head]][i]))//是否可到,到过没{d[++tail]=i;//入队p[i]=1;//记录}}while(head<=tail);return tail;//结果就是长度
}
int main()
{scanf("%d%d%d",&n,&x,&y);while (x&&y){a[x][y]=1;a[y][x]=1;scanf("%d%d",&x,&y);}for (int i=1;i<=n;i++)if (!p[i])//判断ans=max(ans,bfs(i));printf("%d",ans);return 0;
}**

方法四(bfs 邻接表)

用bfs和邻接表(二+三),内容基本就是方法二和方法三的合成体

#include<cstdio>
#include<iostream>
int n,x,y,w,ans,p[101],s[101],d[101];
using namespace std;
struct rec
{int ss,next;//定义
}a[10005];
int bfs(int now)
{int head=0,tail=1;d[1]=now;//预处理p[now]=1;//记录do{head++;for (int i=s[d[head]];i;i=a[i].next)//同一个点连接的不同线if (!p[a[i].ss])//判断到过没{p[a[i].ss]=1;//记录d[++tail]=a[i].ss;//入队}}while(head<=tail);return tail;
}
int main()
{scanf("%d%d%d",&n,&x,&y);while (x&&y){a[++w].ss=y;//后面的数a[w].next=s[x];//同一个点的其他线s[x]=w;//代替a[++w].ss=x;//相反a[w].next=s[y];s[y]=w;scanf("%d%d",&x,&y);}for (int i=1;i<=n;i++)if (!p[i])ans=max(ans,bfs(i));printf("%d",ans);return 0;
}

方法五The last(bfs 邻接表——STL{\color{Red}STL}STL)

个方法四基本相同,但运用了一种鲜为人我知的技术——STL(queue),改了一些地方

#include<cstdio>
#include<iostream>
#include<queue>
int n,x,y,w,ans,p[101],s[101],d[101];
using namespace std;
struct rec
{int ss,next;
}a[10005];
int bfs(int now)
{int g,jg=1;queue<int>d;d.push(now);//在尾端插入p[now]=1;while(d.size()){g=d.front();//队头d.pop();//队头出列for (int i=s[g];i;i=a[i].next)//基本前面的if (!p[a[i].ss]){jg++;//结果p[a[i].ss]=1;d.push(a[i].ss);//入队}}return jg;
}
int main()
{scanf("%d%d%d",&n,&x,&y);while (x&&y){a[++w].ss=y;a[w].next=s[x];s[x]=w;a[++w].ss=x;a[w].next=s[y];s[y]=w;scanf("%d%d",&x,&y);}for (int i=1;i<=n;i++)if (!p[i])ans=max(ans,bfs(i));printf("%d",ans);//和方法四一样的主程序return 0;
}

【dfs】【bfs】【链表】 求连通分量 (ssl 1759)相关推荐

  1. C++通过邻接矩阵求连通分量(BFS)

    在求图的连通分量时可能会碰见的问题--已经构造出了邻接矩阵,但不知道怎么求连通分量.这里选择用BFS来求连通分量. 在开始前先要说明下一些基础知识. 连通分量 如上图图一的连通分量为1,而去掉其中一条 ...

  2. 求连通分量(DFS)(BFS)(STL)

    文章目录 求连通分量 1.深搜(邻接矩阵) 2.深搜(邻接表) 3.广搜(邻接矩阵) 4.广搜(邻接表) 5.STL(邻接表) 谢谢欣赏 求连通分量 Description 求一个图的连通分量 Inp ...

  3. 1.5万字详述 | 全开源:python写小游戏+AI强化学习与传统DFS/BFS控制分别实现

    简介:本周的强化学习我们来到实践部分.我以我在 GitHub 上开源的项目 PiperLiu / Amazing-Brick-DFS-and-DRL 为对象,从零开始与各位朋友分享:如何用 pytho ...

  4. java bfs dfs_java优先搜索(DFS/BFS)实际应用

    深度优先搜索DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.广度优先搜索BFS是Breadth First Sear ...

  5. 洛谷 P1710 地铁涨价 (dfs+bfs)

    地铁涨价 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地铁连接两个不同的站. 地铁计 ...

  6. 【集训】DFS/BFS专训3

    DFS/BFS专训3 文章目录 DFS/BFS专训3 A. 生日蛋糕 B. 埃及分数 C. 最优贸易 D. 关系网络 E. 四色地图 F. 小猫爬山 G. 最大黑区域 H. 引水入城 I. 武士风度的 ...

  7. 数据结构——dfs/bfs

    文章目录 dfs/bfs 迷宫 OpenJ_Bailian - 2790 走迷宫 OpenJ_Bailian - 3752 迷宫问题 POJ - 3984 迷宫(一) 计蒜客 - T1595 迷宫(二 ...

  8. C语言的单链表求交点

    单链表求交点,问题如下: 使用o(1)的空间复杂度,求两个链表相交的时候的交点,这个思想就类似于使用o(1)的空间复杂度和o(n)的时间复杂度来求链表的第k个节点. 过程如下: 获取两个链表的长度 将 ...

  9. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

最新文章

  1. php CI框架输出空行问题排查
  2. 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云...
  3. springboot 日志设计结构
  4. 什么情况使用 weak 关键字,相比 assign 有什么不同?
  5. c语言煎饼问题算法,C煎饼分类程序?
  6. autopep8_Autopep8的使用
  7. 解决zookeeper启动失败Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain报错
  8. 【技术博客】 利用Postman和Jmeter进行接口性能测试
  9. kno DNS 03 Tips - DNS Cookies
  10. MySQL Workbench 6.3CE 汉化及使用教程(转载)
  11. excel如何自动填充123456……
  12. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  13. MAC创建ipv6热点
  14. Ubuntu 16.04 64位 安装 modelsim
  15. 飞行棋程序(附源码)
  16. CPU位数、操作系统位数、指令集、寄存器位数、机器字长等
  17. 软件开发过程与项目管理(12.软件项目合同计划)
  18. Java实现O(nlogn)最长上升子序列
  19. 知数堂郑松华:MySQL 8.0 SQL优化之CTE 、窗口函数的应用
  20. java 轻量级 job_oxygen: 一个轻量级Java框架,包含ioc、aop、config、cache、job、Jdbc、web等...

热门文章

  1. 在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...
  2. eval() php,js-eval编码,js-eval解码
  3. 「软件项目管理」一文详解软件配置管理计划
  4. LeetCode100 相同的树-简单
  5. 找出第i个小元素(算法导论第三版9.2-4题)
  6. windows路由表 重启后就还原了_绕过Apple id并可以随意重启的终极方案来了 (Windows下操作)...
  7. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)
  8. mysql stack is full_mysql优化之表的优化与列类型选择
  9. All CUDA devices are used for display and cannot be used while debugging.
  10. 深入理解 JVM Class文件格式(五)