【强连通分量+概率】Bzoj2438 杀人游戏

Description

一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。 
警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民。 假如查证的对象是杀手, 杀手将会把警察干掉。 
现在警察掌握了每一个人认识谁。 
每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。 
问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?

 

Sulotion

最优的询问对象是,把强连通分量缩成一个点(问其中一个可推出所有,只要不第一次问就是罪犯可以一直安全),问那些入度为0的(这里相当于再把连通的缩为一个点)。

这样我们就得到了一些互不相干的点集,怎么计算概率呢?设点集大小为s1,s2,..

那么ans=(n-1)/n(第一次问不是罪犯)*[(s1-1/n-1)(集合在第一点集中)+((n-s1)/(n-1))*((n-s1-1)/(n-s1))*((s2-1)*(n-s1-1))(分别为,不在第一点集,第二次不问到罪犯,在第二点集的概率)+...]。

上面的式子分子分母可以连着消掉,然后得到ans=(n-tot)/n, tot为点集个数,也就是缩点后入度为0的点。

有一种特殊情况(连通题做一道一道特殊情况...)

如果有一个单独地点(大小为1&&入度为0&&不影响其它点入度是否为0),那么其他的都确定了,他自然也就可以肯定了,也不会对别的点有影响,不用算入tot。

 

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=1e5+5,maxm=3e5+5;
 5 
 6 int pre[maxn],low[maxn],scc[maxn],clock,cnt;
 7 int head[maxn],f[maxm],e[maxm],nxt[maxm],k;
 8 int adde(int u,int v){
 9     e[++k]=v,f[k]=u;
10     nxt[k]=head[u],head[u]=k;
11 }
12 int n,m,r[maxn],a[maxn],t;
13 int size[maxn],num[maxn];
14 
15 int dfs(int u){
16     pre[u]=low[u]=++clock;
17     a[++t]=u;
18     for(int i=head[u];i;i=nxt[i]){
19         int v=e[i];
20         if(!pre[v]){
21             dfs(v);
22             low[u]=min(low[u],low[v]);
23         }
24         else if(!scc[v]){
25             low[u]=min(low[u],pre[v]);
26         }
27     }
28     if(low[u]==pre[u]){
29         num[++cnt]=u;
30         while(t){
31             scc[a[t]]=cnt;
32             size[cnt]++;
33             if(a[t--]==u) break;
34         }
35     }
36 }
37 
38 int pd(int x){
39     int u=num[x];
40     for(int i=head[u];i;i=nxt[i])
41         if(r[scc[e[i]]]==1) return 0;
42     return 1;
43 }
44 
45 int main(){
46     scanf("%d%d",&n,&m);
47     int u,v;
48     for(int i=1;i<=m;i++){
49         scanf("%d%d",&u,&v);
50         adde(u,v);
51     }
52     
53     for(int i=1;i<=n;i++)
54         if(!pre[i]) dfs(i);
55         
56     for(int i=1;i<=k;i++)
57         if(scc[f[i]]!=scc[e[i]]) r[scc[e[i]]]++;
58         
59     int ans=0;
60     for(int i=1;i<=cnt;i++) 
61         if(!r[i]) ans++;
62     
63     for(int i=1;i<=cnt;i++)
64         if(size[i]==1&&!r[i]&&pd(i)){
65             ans--;
66             break;
67         }
68         
69     printf("%.6lf",(double)(n-ans)/n);
70     return 0;
71 }
View Code

 

转载于:https://www.cnblogs.com/xkui/p/4552391.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

serialversionuid的作用_为什么阿里Java规约要求谨慎修改serialVersionUID字段

serialVersionUID简要介绍serialVersionUID是在Java序列化、反序列化对象时起作用的一个字段。Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时&#xff0c;JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进…

fatal error LNK1169: 找到一个或多个多重定义的符号 的解决方案

昨天&#xff0c;尝试一个项目&#xff0c;遇到了如下的问题。先来还原一下&#xff1a; 头文件test.h #pragma once #include <Eigen/Core> #include <iostream>using namespace Eigen; using namespace std;class point2 { public: point2(int x1,int y1):x(x…

常用工具说明--搭建基于rietveld的CodeReview平台(未测试)

为什么要codereview . 整个团队的编码风格是统一的。 . 有高手能对自己的代码指点一二&#xff0c;从而提高编码水平。 . 减少低级错误的出现 . 约束自己写高质量的代码&#xff0c;因为是要给人看的。 我们对codereview的需求 . 很轻松可以发布自己写的代码。 . 很轻松的可以与…

输入的优化

读入整型时&#xff0c;输入优化可以节省不少时间 1 typedef type long long 2 // 这里以long long为例 3 type read() { 4 type x0; int f1; 5 char chgetchar(); 6 while(ch<0||ch>9) {if(ch-) f-1; chgetchar();} 7 while(ch>0&&ch<9) …

python股票分析系统_熬了一晚上,小白用Python写了一个股票提醒系统

码农小马七夕节去相亲了&#xff0c;见了一个不错的姑娘&#xff0c;长的非常甜美&#xff01;聊着聊着很投缘&#xff01;通过介绍人了解到&#xff0c;对方也很满意&#xff5e;&#xff5e;想着自己单身多年的生活就要结束啦&#xff0c;心里满是欢喜&#xff0c;美美哒&…

有关eigen库的一些基本使用方法

目录 介绍安装Demo矩阵、向量初始化C数组和矩阵转换矩阵基础操作点积和叉积转置、伴随、行列式、逆矩阵计算特征值和特征向量解线性方程最小二乘求解稀疏矩阵介绍 Eigen是一个轻量级的矩阵库,除了稀疏矩阵不成熟&#xff08;3.1有较大改进&#xff09;以外,其他的矩阵和向量操作…

汇编程序:将字符串中所有大写字符转为小写

【任务】 编写程序&#xff0c;将数据区中定义的以0作为结束符的一个字符串中所有的大写字符&#xff0c;全部转换为小写。 【参考解答】 assume cs:cseg, ds:dseg, ss:sseg sseg segment stackdw 100h dup (?) sseg ends dseg segmentdb YanTai123University, 0 d…

从零开始编写自己的C#框架(1)——前言

记得十五年前自学编程时&#xff0c;拿着C语言厚厚的书&#xff0c;想要上机都不知道要用什么编译器来执行书中的例子。十二年前在大学自学ASP时&#xff0c;由于身边没有一位同学和朋友学习这种语言&#xff0c;也只能整天混在图收馆里拼命的啃书。而再后来也差不多&#xff0…

Bash内置命令

Bash有很多内置命令&#xff0c;因为这些命令是内置的&#xff0c;因此bash不需要在磁盘上为它们定位&#xff0c;执行速度更快。 1&#xff09;列出所有内置命令列表$enable 2&#xff09;关闭内置命令test$enable -n test 3&#xff09;打开内置命令test$enable test 4&…

postman调用webservice接口_接口对前后端和测试的意义

1.什么是接口&#xff1f;接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。2.接口都有哪些类型&#xff1f;接口…

基于代数距离的椭圆拟合

问题 给定离散点集Xi(xi,yi),i1,2,...NX_i(x_i,y_i) ,i1,2,...NXi​(xi​,yi​),i1,2,...N&#xff0c;我们希望找到误差最小的椭圆去拟合这些离散点。 方法 由于椭圆的形式可以给定&#xff0c; 自然我们将使用最小二乘法来求解椭圆。主要依据论文《Direct least squares f…

Java与C语言比较(Java参考书中摘录)

C语言为面向过程的编程语言&#xff0c;Java为面向对象的编程语言。 在面向过程的编程语言(如C语言)中&#xff0c;编程一般面向操作&#xff0c;编程单位是函数(在Java中函数称为方法)。 在Java中&#xff0c;编程单位是类。最终实例化(即创建)这些类而得到对象&#xff0c;属…

Android调试技巧之Eclipse行号和Logcat

很多初入Android的开发者可能会发现经常遇到Force Close或ANR这样的问题&#xff0c;一般我们通过Android系统的错误日志打印工具Logcat可以看到出错的内容&#xff0c;今天一起来说下如何通过 Eclipse行号和Logcat捕捉出错点&#xff0c;我们遇到错误可以首先在Eclipse的DDMS中…

第六章 产权市场

《市场经济概论》&#xff08;6&#xff09;产权市场一 第六章 产权市场 产权是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权。产权市场是指人们对于某种资产所拥有的所有权、占有权、支配权、使用权进行有偿转让的场所领域及其有关各方面相互关系的总和。在过去…

js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)

1. 下载 ArcGIS API for JavaScript 官网地址&#xff1a; https://developers.arcgis.com/javascript/3/ 下载地址&#xff1a;http://links.esri.com/javascript-api/latest-download需要稳定的网络环境注册账号后才可以下载下载完成后解压文件&#xff0c;文件比较大可能需要…

基于几何距离的椭圆拟合

问题 给定离散点集Xi(xi,yi)X_i(x_i,y_i)Xi​(xi​,yi​)&#xff0c;我们希望找到最好的椭圆去拟合这些离散点。 方法 通常我们使用最小二乘法求解如下的最优化问题&#xff1a; Min∑i1Nf(xi,E)2Min \sum_{i1}^N f(x_i,E)^2 Mini1∑N​f(xi​,E)2 这里f(xi,E)f(x_i,E)f(xi…

Generate Parentheses

题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印预览,用鼠标快速切换显示比例时报错:存储空间不足,不能处理此命令...

CreateCompatibleDIB 存储空间不足 无法处理此命令 安装 ReportViewer 2010 sp1 即可。转载于:https://www.cnblogs.com/runliuv/p/3640856.html

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /*2 贪心/二分查找&#xff1a;首先对ai%p&#xff0c;然后sort&#xff0c;这样的话就有序能使用二分查找。贪心的思想是每次找到一个aj使得和为p-1(如果有的话)3 当然有可能两个数和超过p&#xff0c;那么an的值最优&#xff0c;每次还要和…

nohup命令输出日志_逼格高又实用的Linux高级命令,开发运维都要懂

在运维的坑里摸爬滚打好几年了&#xff0c;我还记得我刚开始的时候&#xff0c;我只会使用一些简单的命令&#xff0c;写脚本的时候&#xff0c;也是要多简单有多简单&#xff0c;所以有时候写出来的脚本又长又臭&#xff0c;像一些高级点的命令&#xff0c;比如说Xargs 命令、…