1013 Battle Over Cities (25 分)

  • 题意 :给图,问去掉所询问的一个点后,需要添加多少条边可以使图连通,N<1000N<1000N<1000
  • 思路 :并查集,将每条边存储,每次删掉一个点时,相当于将与这个点相关的边与这个点本身都不加载在图中,每次重新建图,查询每次新图的连通块个数,加上连通块个数-1的边就可以使图连通
  • 思路 :连通块个数的计算,可以用递减的方式计算,一开始连通块个数等于图上点的个数n - 1,每加入一条边,如果这条边的两个端点原先不在同一个连通块内,则连通块个数-1,否则,continue
  • 语法 :无向图的最大边数M=(N−1)+(N−2)+...+1=N∗(N−1)2=5∗105M = (N - 1) +(N -2)+...+1=\frac{N*(N-1)}{2}=5*10^5M=(N−1)+(N−2)+...+1=2N∗(N−1)​=5∗105
#include <iostream>
#include <vector>
using namespace std;typedef long long ll;
typedef pair<int, int> PII;#define endl '\n'
#define pb push_back
#define fi first
#define se secondconst int N = 1010, M = 5e5 + 10;int fa[N];
struct Edge
{int u, v;
}e[M];int find(int x)
{if (fa[x] != x) fa[x] = find(fa[x]);return fa[x];
}int main()
{cin.tie(nullptr) -> sync_with_stdio(false);int n, m, k; cin >> n >> m >> k;for (int i = 0; i < m; i ++ ) cin >> e[i].u >> e[i].v;while (k -- ){int x; cin >> x;for (int i = 1; i <= n; i ++ ) fa[i] = i;int cnt = n - 1;for (int i = 0; i < m; i ++ ){int u = e[i].u, v = e[i].v;if (u != x && v != x){u = find(u), v = find(v);if (u != v){cnt -- ;fa[u] = v;}}}cout << cnt - 1 << endl;}
}

1114 Family Property (25 分)

题意 :

  • 输入每个人的id和父亲母亲(去世则输入-1)所有孩子和房产数量和房产总面积
  • 输出每个家庭的id(家庭成员中最小的编号),人数,人均房产数量,人均房产面积
  • 按人均房产面积降序顺序输出所有家庭信息。当存在人均房产面积相同的情况时,按 ID 升序顺序排序。

思路 :

  • 先读入每个人的信息,再根据存下来的每条边,利用并查集,将连通块内的人的信息合并在连通块内编号最小的人身上
  • 然后遍历人,找到每个连通块内编号最小的人(也就是家主),这一步需要之前输入信息时,记录哪些人是连通块内存在

语法 :

  • 自定义排序时,尽量避免用除法,将出发转换为乘法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int N = 1e4 + 10;typedef pair<int, int> PII;int n;
int hc[N], ha[N];
bool st[N];
PII e[N * 2];
int m;
int pa[N];
int c[N];struct Family
{int id, c, hc, ha;bool operator< (const Family &t) const{// ha / c > t.ha / t.cif (ha * t.c != t.ha * c) return ha * t.c > t.ha * c;return id < t.id;}
};int find(int x)
{if (pa[x] != x) pa[x] = find(pa[x]);return pa[x];
}int main()
{scanf("%d", &n);int id, fa, mo, k, son;for (int i = 1; i <= n; i ++ ){scanf("%d%d%d%d", &id, &fa, &mo, &k);st[id] = true;if (fa != -1) e[m ++ ] = {id, fa}, st[fa] = true;if (mo != -1) e[m ++ ] = {id, mo}, st[mo] = true;for (int j = 1; j <= k; j ++ ){scanf("%d", &son);e[m ++ ] = {id, son};st[son] = true;}scanf("%d%d", &hc[id], &ha[id]);}for (int i = 0; i < N; i ++ ) pa[i] = i, c[i] = 1;for (int i = 0; i < m; i ++ ){int a = e[i].first, b = e[i].second;a = find(a), b = find(b);if (a != b){if (a > b) swap(a, b);hc[a] += hc[b];ha[a] += ha[b];c[a] += c[b];pa[b] = a;}}vector<Family> family;for (int i = 0; i < N; i ++ ){if (st[i] && pa[i] == i)family.push_back({i, c[i], hc[i], ha[i]});}sort(family.begin(), family.end());printf("%d\n", family.size());for (auto &f : family)printf("%04d %d %.3lf %.3lf\n", f.id, f.c, (double)f.hc / f.c, (double)f.ha / f.c);}

1118 Birds in Forest (25 分)

题意 :

  • 假设所有出现在同一张照片中的鸟都属于同一棵树。
  • 请你帮助科学家计算森林中树木的最大数量,对于任何一对鸟类,请判断它们是否在同一棵树上。

思路 :

  • 连通块的数量就是鸟的数量减去被合并的次数
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 10010;int n;
int birds[10];
int p[N];
bool st[N];int find(int x)
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{scanf("%d", &n);for (int i = 0; i < N; i ++ ) p[i] = i;int cnt = 0;for (int i = 0; i < n; i ++ ){int k;scanf("%d", &k);for (int j = 0; j < k; j ++ ){scanf("%d", &birds[j]);st[birds[j]] = true;}for (int j = 1; j < k; j ++ ){int a = birds[j - 1], b = birds[j];a = find(a), b = find(b);if (a != b){p[a] = b;cnt ++ ;}}}int tot = 0;for (int i = 0; i < N; i ++ ) tot += st[i];printf("%d %d\n", tot - cnt, tot);int q;scanf("%d", &q);while (q -- ){int a, b;scanf("%d%d", &a, &b);if (find(a) == find(b)) puts("Yes");else puts("No");}return 0;
}

PAT甲级题目翻译+答案 AcWing(并查集)相关推荐

  1. PAT甲级题目翻译+答案 AcWing(树)

    1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...

  2. PAT甲级题目翻译+答案 AcWing(数学)

    1059 Prime Factors (25 分) 题意 : 给一正整数,要求分解质因数 思路 : 使用is_first,来完成除了第一个质因数前都有*的效果 如果n=1,要特判 最后如果n>1 ...

  3. PAT甲级题目翻译+答案 AcWing(排序)

    1012 The Best Rank (25 分) 题意 :给ID和3门成绩,计算其平均分A,输出每位学生最好的排名,A>C>M>E 思路 :如果将所需的若干个元素中使第一个元素为后 ...

  4. PAT甲级题目翻译+答案 AcWing(模拟)

    1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...

  5. PAT甲级题目翻译+答案 AcWing(动态规划)

    1007 Maximum Subsequence Sum (25 分) 题意 :注意最后输出的不是索引而是在那个索引的数 思路 :f为当前的假设开始指针,每一次累加到sum,如果sum大于res,就更 ...

  6. PAT甲级题目翻译+答案 AcWing(图论)

    1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...

  7. PAT甲级题目翻译+答案 AcWing(进位制)

    1010 Radix (25 分) 题意 :radix进制 题意 :给两个数和其中一个数的进制,问另一个数能否在某一进制下与这数相等 思路 :如果tag等于2就交换,最后还是只需要处理tag为1这种情 ...

  8. PAT甲级题目翻译+答案 AcWing(字符串处理)

    1001 A+B Format (20 分) 题意 :将整数转换成标准格式 思路 :从后往前遍历字符串进行模拟,每三个数字加一个逗号,但不能是在最前面加逗号,也不能是加在负号后面 #include & ...

  9. PAT甲级题目翻译+答案 AcWing(链表)

    1032 Sharing (25 分) 题意 : suffix后缀:prefix前缀 每个结点存一个字母,一共存两个单词 分别给两个单词的第一个字母的地址以及总共的结点数 给出所有结点的地址数值和下一 ...

最新文章

  1. Vue_error Expected indentation of 2 spaces but found 3 indent问题整理
  2. 解决matplotlib中文乱码问题
  3. JSR 303约束规则
  4. Java黑皮书课后题第4章:*4.14(转换字母等级为数字)编写程序,提示用户输入一个字母等级A、B、C、D或者F,显示对应的数字值4、3、2、1或者0。对其它输入,提示非法等级
  5. 基于matlab的音乐合成论文,基于matlab软件的音乐合成毕业论文.doc
  6. 文本属性之行间距(CSS、HTML)
  7. C#3.0 语言基础扩充
  8. 记录C语言课程设计报告-图书管理系统
  9. 倍福TwinCAT软件安装及注意事项
  10. 计算机桌面截图怎么截,电脑怎么截图?电脑截图的五大方法
  11. 小白开始学RTOS 1
  12. HTML+CSS 网页排版 笔记
  13. mysql中分层查询_在mysql中连接任意数量的字符串行(分层查询)
  14. #R语言# 生成随机数
  15. 转:(记录)C语言中的itoa()函数的用法解析
  16. poi删除带有合并单元格的行的问题
  17. android bilibili弹幕技术解析,bilibili弹幕爬取与比对分析
  18. MUR20060CT-ASEMI快恢复模块200A 600V
  19. 微凉日子,菠菜鸡丝面
  20. 阿里云mysql主从有延迟怎么办_MySQL主从数据库同步延迟问题解决-阿里云开发者社区...

热门文章

  1. 物料帐结算,库存差异为何在下月初冲回
  2. LSMW批处理使用方法(05)_步骤3下
  3. SAP ABAP:获取汇率的完整实现之一
  4. PC上虚拟机中安装NW 7.02 ABAP试用版
  5. 付费用户减少一成,阅文集团还能否为自己“造血”?
  6. 计算机辅助普通话水平测试评分办法,江苏省计算机辅助普通话水平测试评分细则...
  7. 用python实现复选框树_如何使用Python中的复选框创建树视图
  8. Auto Lisp 标注子样式_FAIR 开放大规模细粒度词汇级标记数据集 LVIS,连披萨里的菠萝粒都能完整标注...
  9. 攻防世界(Pwn) PWN100
  10. python 匿名函数捕获变量值 (执行时的值)