当前位置: 首页 > wzjs >正文

济南代做标书网站标志福州网站seo优化公司

济南代做标书网站标志,福州网站seo优化公司,酒店要做关于网站ppt怎么做,静态网站开发 内容题目 给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。 现在要进行 m 个操作,操作共有三种: C a b,在点 a 和点 b 之间连一条边,a和 b 可能相等;Q1 a b,询问…

题目

给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。

现在要进行 m 个操作,操作共有三种:

C a b,在点 a 和点 b 之间连一条边,a和 b 可能相等;Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b
可能相等; Q2 a,询问点 a 所在连通块中点的数量;

输入格式

第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。

输出格式

对于每个询问指令 Q1 a b,如果 a 和 b 在同一个连通块中,则输出 Yes,否则输出 No。

对于每个询问指令 Q2 a,输出一个整数表示点 a 所在连通块中点的数量

每个结果占一行。

数据范围

1≤n,m≤105

输入样例:

5 5

C 1 2

Q1 1 2

Q2 1

C 2 5

Q2 5

输出样例:

Yes

2

3

来源:acwing算法基础837. 连通块中点的数量


思路(注意事项)


纯代码

#include<bits/stdc++.h>
using namespace std;const int N = 100010;
int p[N], si[N];int find(int x)
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) {	p[i] = i;si[i] = 1;}while (m --){char c[2];int a, b;scanf("%s", c);if (c[0] == 'C') {	scanf("%d%d", &a, &b);if (find(a) == find(b)) continue;si[find(b)] += si[find(a)];p[find(a)] = find(b);}else if (c[1] == '1'){scanf("%d%d", &a, &b);if (find(a) == find(b)) cout << "Yes" << endl;else cout << "No" << endl;}else {scanf("%d", &a);cout << si[find(a)] << endl;}}return 0; 
}

题解(带注释)

#include<bits/stdc++.h>
using namespace std;const int N = 100010; // 定义最大节点数
int p[N]; // 并查集数组,p[i] 表示节点 i 的父节点
int si[N]; // 存储每个集合的大小,si[i] 表示以 i 为根节点的集合的大小// 查找函数,用于查找节点 x 的根节点,并进行路径压缩
int find(int x)
{// 如果 x 不是根节点,递归查找其父节点的根节点,并进行路径压缩if (p[x] != x) p[x] = find(p[x]);// 返回 x 的根节点return p[x];
}int main()
{int n, m; // n 表示节点数,m 表示操作数cin >> n >> m; // 输入节点数和操作数// 初始化并查集for (int i = 1; i <= n; i++) {	p[i] = i; // 每个节点的父节点初始化为自己si[i] = 1; // 每个集合的大小初始化为 1}// 处理每个操作while (m --){char c[2]; // 操作类型int a, b; // 操作涉及的两个节点scanf("%s", c); // 输入操作类型if (c[0] == 'C') // 如果是合并操作{	scanf("%d%d", &a, &b); // 输入要合并的两个节点if (find(a) == find(b)) continue; // 如果已经在同一个集合中,跳过si[find(b)] += si[find(a)]; // 将 a 所在集合的大小加到 b 所在集合的大小上p[find(a)] = find(b); // 将 a 所在集合的根节点的父节点设置为 b 所在集合的根节点}else if (c[1] == '1') // 如果是查询操作(查询两个节点是否在同一个集合中){scanf("%d%d", &a, &b); // 输入要查询的两个节点if (find(a) == find(b)) cout << "Yes" << endl; // 如果在同一个集合中,输出 Yeselse cout << "No" << endl; // 否则输出 No}else // 如果是查询操作(查询某个节点所在集合的大小){scanf("%d", &a); // 输入要查询的节点cout << si[find(a)] << endl; // 输出该节点所在集合的大小}}return 0; 
}
http://www.dtcms.com/wzjs/478207.html

相关文章:

  • 项目网站建设方案模板新乡网站优化公司
  • 移动网站开发的视频下载深圳全网信息流推广公司
  • 微网站建设高端网站定制b站免费版入口
  • 网站开发服务器西安做网页的公司
  • 做机械设备的做哪个网站推广较好网站关键词优化方案
  • 适合新手做网站的培训机构有哪些
  • 南昌正规网站公司哔哩哔哩b站在线看免费
  • 初学者自己做网站百度搜索引擎优化怎么做
  • 群晖wordpress主题新乡seo顾问
  • 网页制作如何设置网页背景seo的最终是为了达到
  • e京汕头第一网河南网站建设优化技术
  • 做网站java好还是.net好百度营销推广
  • 济南网站建设专业网络推广方案的内容
  • 南宁网站建设q479185700棒深圳今日重大新闻
  • 广东省网站建设网站佛山做优化的公司
  • 做网站需要人员设计网络营销方案
  • 做web网站常用框架珠海百度seo
  • wordpress有赞云郑州网站关键词优化外包
  • 什么网站做护工b站推广网站入口
  • 设计网站怎么做免费网站优化排名
  • 移动app设计网站建设黑帽seo是作弊手法
  • django做的网站友情链接交换工具
  • 我的世界做视频封面的网站怎么做平台推广
  • 郫县哪里有做网站的郑州seo询搜点网络效果佳
  • jsp网站建设美食个人网站设计作品
  • 做网站后怎样让其他人交互关键词
  • 建一个淘宝客网站需要多少钱seo网站优化培训公司
  • 如何建设网站app滕州seo
  • 寺庙网站建设怎么制作网站教程步骤
  • 杭州模板建站软件公司网站制作教程