这个题题目描述还是有一点问题。。这里的知道关系是有传递性的。第一次理解成只会明白直接相连的,最小点覆盖  ……   这样就成np了吧。。

所以就比较显然了,,对于每组能互达的强连通分量,都只需一个头上的点就可以便利整组强连通分量

然后仅剩一个是可以推的,特判一下。

答案=(n-必须访问人数)/n

证明:第一个访问的人是安全的概率     (n-1)/n

设第一个人能知道m1个人

找出的m1个人中有杀手的概率    (m1)/(n-1)

找第一个人就结束的概率== (n-1)/n  *  (m1)/(n-1)  ==m1/n

找出的m1个人中没有杀手的概率   (n-1)/n  *(n-1-m1)/(n-1)=(n-1-m1)/n

第二个访问的人是安全的概率     (n-m1-2)/(n-m1-1)

设第二个人能知道m2个人

找出的m2个人中有杀手的概率    (m2)/(n-m1-2),,若m1+m2+2已经==n,则这个概率==1

找第二个人就结束的概率== (n-1-m1)/n   *   (n-m1-2) / (n-m1-1) *  1  =(n-m1-2)/n

最后概率=m1 / n  +(n-m1-2)/n==(n-2)/n   2即是访问人数

不知道这算不算证明,,

码:

#include<iostream>
#include<cstdio>
using namespace std;
#include<vector>
#define N 100005
vector<int>v[N],jh[N],v2[N];
int tot,dfn[N],low[N],cnt,top,zhan[N],sy[N],rd[N],n,i,j,m,a,b,k,now[N];
double ans;
void tarjan(int o)
{dfn[o]=low[o]=++tot;zhan[++top]=o;int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(!dfn[nd]){tarjan(nd);low[o]=min(low[nd],low[o]);}else{if(sy[nd]==0)low[o]=min(low[nd],low[o]);          }}if(low[o]==dfn[o]){++cnt;while(zhan[top]!=o){int nd=zhan[top];jh[cnt].push_back(nd);sy[nd]=cnt;top--;} int nd=zhan[top];jh[cnt].push_back(nd);sy[nd]=cnt;top--;}
}
void work()
{bool kys=0;tot=0;for(i=1;i<=cnt;i++){if(rd[i]==0){tot++;bool ky=1;if(jh[i].size()!=1)ky=0;for(j=0;j<v2[i].size();j++){
if(rd[v2[i][j]]==1)ky=0;     }
if(ky==1)kys=1;          }       }if(kys)tot--;ans=double(n-tot)/n;
}
int main()
{scanf("%d%d",&n,&m);if(n==1){  printf("1.000000");return 0;}for(i=1;i<=m;i++){scanf("%d%d",&a,&b);v[a].push_back(b);    }
for(i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);for(i=1;i<=cnt;i++){for(j=0;j<jh[i].size();j++){int st=jh[i][j];for(k=0;k<v[st].size();k++)
{int nd=v[st][k];if(sy[nd]==i)continue;v2[i].push_back(sy[nd]);if(now[sy[nd]]!=i)rd[sy[nd]]++,now[sy[nd]]=i;
}}      }work();    printf("%.6lf",ans);
}

2017.10.10 杀人游戏 思考记录相关推荐

  1. 2017.3.24 分裂游戏 思考记录

    事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了..    感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...

  2. 2017.10.13 硬币游戏 思考记录

    这个题用特征法可以比较好的找到思路 首先这个题有两个特征:1.正+反=反   反+正=反  正+正=正  反+反=正   应该能很快想到亦或 2.范围1e5  +  上限2^60   应该能很快想到倍 ...

  3. 2017.4.27 道路游戏 思考记录

    这个题一开始把题读错了..而且读错三次(出这种语文题 简直毒瘤) 一开始认为成了可以一边买一边跑...结果发现是n^4 然后认为成了可以不移动结束就可以买....结果发现是n^3  于是全wa 然后认 ...

  4. 2017.9.10 连续攻击游戏 思考记录

    这个题..可以把它当成结论题搞, 结论就是对于每个数字的出现次数,如果区间1~n内的出现次数都>=2,那么这个区间1~n内都会合法 这个结论很好证明,连到外面可以视为停止   外面连进来的可以视 ...

  5. 2017.10.29 染色方案 思考记录

    这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...

  6. 2017.10.9 放棋子 思考记录

    .这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案  g表示 ...

  7. 2017.10.24 上升序列 思考记录

    终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...

  8. 2017.10.7 括号序列 思考记录

    这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...

  9. 2017.10.30 覆盖问题 思考记录

    从细节入手已经从一种技巧变成一种策略了. 题目给出的条件很奇怪,是3个正方形,, 为什么是3个而不是4个或2个呢.. 于是先用一个大矩形把所有点卡住 然后显然矩形的每个边 都有一个正方形和他在一条直线 ...

最新文章

  1. 应用内设置语言不重启方法
  2. $(@_config=)什么意思?
  3. 启动elasticsearch命令_快速安装ElasticSearch
  4. mysql ef_在EF中使用MySQL的方法及常见问题
  5. 产品经理十八章:产品创新能力(二)
  6. 改改Python代码,运行速度还能提升6万倍,Science:先别想摩尔定律了
  7. oracle signed类型,char、signed char 和 unsigned char 的区别
  8. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点
  9. python多态如何理解_大家对python中多态是如何理解的?
  10. hdu1059Dividing
  11. 使用Quartz做定时器
  12. pyCharm汉化方法
  13. JAVA中读取配置文件以及修改配置文件
  14. gltf、glb模型下载
  15. 关于docker容器启动后,浏览器无法正常访问相关问题——docker 宿主机与容器不通
  16. java微信支付超时_Java语言:微信支付之关闭订单
  17. php系统性能分析论文,系统性能分析-PHP/Linux@HeFei-51CTO博客
  18. 公众号(服务号)申请与认证
  19. EasyDarwin开源流媒体服务器
  20. 两个常用算法day1

热门文章

  1. python xposed_xposed + python 怎么爬取微信朋友圈的数据
  2. 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
  3. 怎样对流媒体进行压力测试_对node工程进行压力测试与性能分析「干货」
  4. inline函数_逼近函数(2)
  5. EmEditor18.1.2 注册码
  6. 初步使用计算机学设计,幼儿园计算机教学设计参考
  7. webpack打包压缩混淆_细说webpack系列 3. webpack-cli 零配置打包
  8. 禅道的安装与简单使用
  9. 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树
  10. matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...