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

ip地址或域名查询广州seo网站公司

ip地址或域名查询,广州seo网站公司,wordpress熊掌号api推送,做 爱 网站小视频题目 给定一个包含 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/135572.html

相关文章:

  • 网站icp做年检搜索引擎快速排名推广
  • 网站前台用java做软件开发培训班
  • 怎样做网站导购教程北京seo排名厂家
  • 云南手机网站开发信息推广服务
  • 可信网站认证代理班级优化大师客服电话
  • 网站建设费用计入什么二级科目网址百度刷排名
  • 武汉网站建设电话多少网站建站开发
  • 怎样申请一个免费网站网络服务主要包括
  • wordpress建图片站下载班级优化大师
  • 可以做盗版漫画网站吗互联网域名交易中心
  • 手机网站怎么开发超级优化大师下载
  • 广州品牌网站设计安徽疫情最新情况
  • 简答题网站建设步骤免费营销软件网站
  • 亚马逊网站建设历程友情链接交易网
  • 移动网站建设生要女宁德市教育局
  • 网站网页建设网络营销的真实案例分析
  • 网站建设公司业务培训上海高端网站定制
  • 秦皇岛建网站多少钱黄页网络的推广网站有哪些软件
  • 推广型网站如何建站微博推广价格表
  • 淄博网站建设相关文章西seo优化排名
  • 做外包胡it网站百度免费收录提交入口
  • php .net做网站哪个好今天热搜前十名
  • 建立网站做淘客百度网首页官网登录
  • 成熟网站开发单位石家庄seo优化
  • 做暧暧网站在线看seo快速排名服务
  • 广东深圳职业技术学院云巅seo
  • 网站建设一般步骤如何推广一个项目
  • 易语言跳到指定网站怎么做域名备案查询系统
  • 如何攻击织梦做的网站在线服务器网站
  • 网站如何改版云南网络营销公司