题解 P4819
前言:
看到目前的题解当中没有并查集做法,于是写一篇水水。
题目描述:
给定一张图,一个图中有黑白两种颜色,已知黑色的点有且只有一个,且每个点是黑色的概率相等,然后点 \(u\) 与点 \(v\) 之间的边表示 \(u\) 知道 \(v\) 是什么颜色,我们的目的是找到黑点。
问在达成目的并且看点颜色次数最少的情况下,看的点的颜色不是黑色的概率为多少。
题意分析:
首先,根据给出的题意,不难得出这样的结论:
如果当前在一个环上,则我们可以从环上任意一个点出发,若该点不是黑色,则可以在不看到黑色的情况下知道整个环的点的颜色。
根据此条性质,我们可以对原图进行缩点。
然后,考虑维护一个并查集,对缩点后得到的新图的每个点进行遍历,看看当前点 \(u\) 能访问到那些点 \(v\),然后按照如下规则进行两个 \(u\)、\(v\) 点的信息合并:
- 若点 \(v\) 没有被合并,则将 \(v\) 合并到 \(u\) 所在的集合中。
- 若点 \(u\) 被合并了,则不进行合并。
最后,我们统计集合大小为 \(\boldsymbol{1}\) 的集合的个数 \(\boldsymbol{a}\) 和集合大小大于 \(\boldsymbol{1}\) 的集合的个数 \(\boldsymbol{b}\)。
此时,需要看的点的个数 \(k\) 如下:
- 若 \(a=0\),则 \(k = b\)。
- 否则,若 \(a>1\),则 \(k = a + b - 1\)。
- 否则,若 \(n=1\),则 \(k = 0\)。
最后,我们的答案就是 \(\dfrac kn\)(请别忘了保留 \(6\) 位小数)。
注意:
- 本题使用
long double会炸掉精度,请使用double计算答案。 - 本题请务必要特判 \(n=1\) 的情况,因为当 \(n=1\) 的时候,那个点必定是黑点,不需要去看。
综上,时间复杂度 \(O(n \lg n)\)
代码实现:
#include <bits/stdc++.h>
#define debug(x) cerr << #x << ": " << x << endl;
#define int long long
using namespace std;
const int N = 3e5 + 9;
#define MAX_SIZE (int)1.1e5
struct node
{
int to, next;
};
node edge[N];
int n, m, u, v, tot, cnt, sum, top, res, flag, cnt1;
int head[MAX_SIZE];
int dfn[MAX_SIZE];
int low[MAX_SIZE];
int sta[MAX_SIZE];
int col[MAX_SIZE];
int ind[MAX_SIZE];
int siz[MAX_SIZE];
bool vis[MAX_SIZE];
void add(int u, int v)
{
edge[++tot].to = v;
edge[tot].next = head[u];
head[u] = tot;
}
void tarjan(int u)
{
dfn[u] = low[u] = ++cnt;
vis[u] = 1, sta[++top] = u;
for (int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to;
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (vis[v])
{
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u])
{
col[u] = ++sum;
vis[u] = 0;
siz[sum] = 1;
while (sta[top] != u)
{
col[sta[top]] = sum;
vis[sta[top]] = 0;
--top;
siz[sum]++;
}
--top;
}
return;
}
int head2[MAX_SIZE];
int Next[MAX_SIZE];
int ver[MAX_SIZE];
int tot2 = 0;
void Add(int u, int v)
{
ver[++tot2] = v;
Next[tot2] = head2[u];
head2[u] = tot2;
}
int fa[MAX_SIZE];
int fasiz[MAX_SIZE];
void init(int size)
{
for (int i = 1; i <= size; i++)
{
fa[i] = i;
fasiz[i] = 1;
}
}
int getfa(int x)
{
if (x == fa[x])
return fa[x];
return fa[x] = getfa(x);
}
void merge(int u, int v)
{
int x = getfa(u);
int y = getfa(v);
fa[y] = x;
fasiz[x] += fasiz[y];
}
signed main()
{
ios::sync_with_stdio(false);
#ifdef LOCAL
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
double c1 = clock();
#endif
//============================================
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
add(u, v);
}
for (int i = 1; i <= n; i++)
if (!dfn[i])
tarjan(i);
for (int u = 1; u <= n; u++)
{
for (int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to;
if (col[u] != col[v])
{
Add(col[u], col[v]);
++ind[col[v]];
}
}
}
init(sum);
for (int u = 1; u <= sum; u++)
{
for (int i = head2[u]; i; i = Next[i])
{
int v = ver[i];
if (fa[v] != v)
continue;
merge(u, v);
}
}
int lookup = 0;
int lonely = 0;
for (int i = 1; i <= sum; i++)
{
if (fa[i] == i)
{
if (fasiz[i] > 1)
++lookup;
else
++lonely;
}
}
if (lonely)
{
if (lonely > 1)
--lonely;
else if (lookup)
--lonely;
else if (n == 1)
lonely = 0;
}
printf("%.6lf\n", (double)(n - lookup - lonely) / (double)(n));
//============================================
#ifdef LOCAL
double c2 = clock();
cerr << "Used Time: " << c2 - c1 << "ms" << endl;
if (c2 - c1 > 1000)
cerr << "Warning!! Time Limit Exceeded!!" << endl;
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
题解 P4819的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: java.net.ConnectException: 拒绝连接 (Connection refused) (state=08S01,code=0)
一:启动hiveserver2服务 二:启动beeline 三:连接hiveserver2(下面的1000000端口号适当改小写因为其超出最大端口号的范围建议改为10000) 如果启动不成功实现我们先 ...
- React:TypeError: Cannot read properties of undefined (reading 'map')
解决方案 js中?问号代表可选项 可选链式操作符 参考链接 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Oper ...
- 宝塔面板配合tomcat部署静态资源网站
在宝塔中安装下图所示软件 第一步:上传代码到服务器 第二步,点击JAVA项目一键部署 点击添加项目 第一次使用时项目版本是为空的,点击下方的版本管理进行安装 需要填写的选项 至此配置完成 访问方式 i ...
- Hugging News #0731: 新课程重磅发布、用户交流群邀请你加入、真实图像编辑方法 LEDTIS 来啦!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- frp内网穿透环境搭建--服务端ubuntu 客户端win10
前提条件:1个公网ip服务器,例如我的是腾讯云服务器ubuntu20 下载frp软件,下的是0.33.0版本,该版本直接把软件封装成服务,能用ubuntu直接定义开机自启等 github:https: ...
- 用Python语言进行多元时间序列ARIMAX模型分析
1.ARIMAX模型定义 ARIMAX模型是指带回归项的ARIMA模型,又称扩展的ARIMA模型.回归项的引入有利于提高模型的预测效果.引入的回归项一般是与预测对象(即被解释变量)相关程度较高的变量. ...
- 基于C#的消息处理的应用程序 - 开源研究系列文章
今天讲讲基于C#里的基于消息处理的应用程序的一个例子. 我们知道,Windows操作系统的程序是基于消息处理的.也就是说,程序接收到消息代码定义,然后根据消息代码定义去处理对应的操作.前面有一个博文例 ...
- Vue【原创】可拖动列表 darg-list
可拖动排序的列表 drag-list,这个比较简单易懂,拿例子直接运行看效果就好了. 组件代码: 1 <template> 2 <ul class="list" ...
- Codeforces Round 882 div.2 B
Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...
- 用OLED屏幕播放视频(1): 项目介绍
下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这篇文章主要对项目的实现做整体的介绍, 包括硬 ...