L2-013 红色警报 (25分) 并查集复杂度

代码:
1 /*
2 这道题也是简单并查集,并查集复杂度:
3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)),
4 这里Alpha是Ackerman函数的某个反函数,在很大的范围内(人类目前观测到的宇宙范围估算有10的80次方个原子,
5 这小于前面所说的范围)这个函数的值可以看成是不大于4的,所以并查集的操作可以看作是线性的。
6
7 不弄清楚一个算法的复杂度就是不敢很用
8
9
10 题解:
11 在询问时,标记当前结点,然后将其余的结点并查集一次,求出集合数,
12 如果集合数相等或者前面完整结点的集合数+1=当前集合数,那么也就说明了去掉当前结点是没什么影响的,
13 其余情况就是有影响
14
15 思路很好想,了解了复杂度之后就敢下手了
16
17 解释一下下面内容:
18 1、集合数相等为什么说明了去掉当前结点是没什么影响
19 当你标记一个点之后,在进行并查集这个时候肯定会把这个点孤立出来,也就是多了一个只有这一个点的集合
20 如果在原图中这个点就被孤立,那么标记之后还是相当于孤立,那么这个时候去掉当前结点是没什么影响
21
22 2、前面完整结点的集合数+1=当前集合数时为什么说明了去掉当前结点是没什么影响
23 如果这个点原本并不在原图中孤立,那么如果标记这个点之后,如果这个点去掉不会造成影响,那么标记这个点之后的集合数要比
24 之前的大1
25 */
26 #include<stdio.h>
27 #include<string.h>
28 #include<iostream>
29 #include<algorithm>
30 #include<queue>
31 using namespace std;
32 const int maxn=505;
33 int n,m;
34 struct node
35 {
36 int u,v;
37 } e[5005];
38 int vist[550],fa[550];
39 int Find(int x)
40 {
41 return x==fa[x]?fa[x]:Find(fa[x]);
42 }
43 void Union(int x,int y)
44 {
45 int xc=Find(x);
46 int yc=Find(y);
47 if(xc!=yc)
48 {
49 fa[xc]=yc;
50 }
51 }
52 int main()
53 {
54 int k;
55 int u,v;
56 while(scanf("%d%d",&n,&m)!=EOF)
57 {
58 for(int i=0; i<n; i++)
59 fa[i]=i;
60 for(int i=0; i<m; i++)
61 {
62 scanf("%d%d",&u,&v);
63 e[i].u=u,e[i].v=v;
64 Union(u,v);
65 }
66 int num=0,num1;
67 for(int i=0; i<n; i++)
68 {
69 if(fa[i]==i)
70 {
71 num++;
72 }
73 }
74 memset(vist,0,sizeof(vist));
75 scanf("%d",&k);
76 while(k--)
77 {
78 num1=0;
79 for(int i=0;i<n;i++)
80 fa[i]=i;
81 int x;
82 scanf("%d",&x);
83 vist[x]=1;
84 for(int i=0;i<m;i++)
85 {
86 if(vist[e[i].u]==1||vist[e[i].v]==1)
87 continue;
88 else
89 Union(e[i].u,e[i].v);
90 }
91 for(int i=0;i<n;i++)
92 if(fa[i]==i)
93 num1++;
94 if(num==num1||num+1==num1)
95 printf("City %d is lost.\n",x);
96 else
97 printf("Red Alert: City %d is lost!\n",x);
98 num=num1;
99 }
100 num=0;
101 for(int i=0;i<n;i++)
102 if(vist[i]==1)
103 num++;
104 if(num==n)
105 printf("Game Over.\n");
106 }
107 return 0;
108 }
L2-013 红色警报 (25分) 并查集复杂度的更多相关文章
- L2-007 家庭房产 (25分) 并查集
题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...
- PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- PAT-1107 Social Clusters (30 分) 并查集模板
1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...
- PAT A 1118. Birds in Forest (25)【并查集】
并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...
- PAT甲题题解-1021. Deepest Root (25)-dfs+并查集
dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- PAT甲题题解-1114. Family Property (25)-(并查集模板题)
题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...
- PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性
题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
随机推荐
- vim 手动添加脚本头部信息
vim /root/.vimrc 8,1 全部 set autoindent set tabstop=5 set shiftwidth=4 function AddTitle() call setli ...
- npm i 报错 'match' of undefined 错误以及删除node_modules失败
简单粗暴的解决办法就是一个字'删', 1.先把node_modules给删了 手动删除的话,window系统经常会有部分删不了,说需要个权限什么的,直接用rimraf 就能解决 先安装npm inst ...
- wmic process进程管理
process 进程管理工具 示例:1.列举当前的进程.进程路径.命令行.进程ID.父进程ID.线程数,内存使用::wmic process get name,executablepath,co ...
- 【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
欢迎使用 Blazor!Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...
- 24V转5V稳压芯片,高效率的同步降压DC-DC变换器3A输出电流
PW2330开发了一种高效率的同步降压DC-DC变换器3A输出电流.PW2330在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失.PW2330采 ...
- 1.2V转3V芯片,电路图很少就三个元件
1.2V的镍氢电池由于稳定高,应用产品也是很广,但是由于电压低,需要1.2V转3V芯片,来将1.2V的电压升压转3V,稳定输出供电. 一般性的1.2V转3V芯片,都是用PW5100比较多,固定输出电压 ...
- uni-app开发经验分享六:页面跳转及提示框
在我们开发的uni-app的过程中,页面跳转及提示框往往是我们做数据交互及结果反馈所要使用的功能,这里分享下我收集的一些方法及看法. 一:页面跳转 事件跳转 :指通过tap等事件来实现页面的跳转,跳转 ...
- javascript通过递归改子节点数据-用于层级深度未知的树形结构
最近在做这么个需求:树形结构,层级深度未知,一旦某个节点的状态是置灰的话,其所有子节点都要置灰. 方案一(数据库有值):如果数据库里置灰节点的所有子节点,值也都是"置灰",那后台取 ...
- CentOS 7.2系统安装步骤
CentOS 7.2系统安装步骤 1.把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ES ...
- 调度 GMP
小结: 1. 当M从P的本地运行队列获取G时, 如果发现本地队列为空会尝试从其他P盗取一半的G过来,这个机制叫做Work Stealing, 2. Q M一定需要p吗? A 不一定.M正在执行原生代码 ...