[补档][中山市选2011]杀人游戏
生活随笔
收集整理的這篇文章主要介紹了
[补档][中山市选2011]杀人游戏
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
[中山市選2011]殺人游戲
題目
一位冷血的殺手潛入 Na-wiat,并假裝成平民。警察希望能在 N 個(gè)人里面,查出誰(shuí)是殺手。 警察能夠?qū)γ恳粋€(gè)人進(jìn)行查證,假如查證的對(duì)象是平民,他會(huì)告訴警察,他認(rèn)識(shí)的人,誰(shuí)是殺手,誰(shuí)是平民。假如查證的對(duì)象是殺手,殺手將會(huì)把警察干掉。 現(xiàn)在警察掌握了每一個(gè)人認(rèn)識(shí)誰(shuí)。 每一個(gè)人都有可能是殺手,可看作他們是殺手的概率是相同的。 問(wèn):根據(jù)最優(yōu)的情況,保證警察自身安全并知道誰(shuí)是殺手的概率最大是多少?INPUT
第一行有兩個(gè)整數(shù) N,M。 接下來(lái)有 M 行,每行兩個(gè)整數(shù) x,y,表示 x 認(rèn)識(shí) y(y 不一定認(rèn)識(shí) x)。OUTPUT
僅包含一行一個(gè)實(shí)數(shù),保留小數(shù)點(diǎn)后面 6 位,表示最大概率。SAMPLE
INPUT
5 4 1 2 1 3 1 4 1 5OUTPUT
0.800000解題報(bào)告
考試時(shí)沒(méi)想出來(lái),隨便打的輸出樣例- - 正解: 警察只有兩種結(jié)果——查到犯人或者死,而死一定是包含在“調(diào)查未知身份的人”,也就是說(shuō)調(diào)查未知身份的人越多,死亡概率越高,所以我們要求警察如何盡可能少調(diào)查未知身份的人 那么問(wèn)題就很簡(jiǎn)單了,我們發(fā)現(xiàn)對(duì)于一個(gè)強(qiáng)連通分量,我們可以把他們看作一個(gè)人,因?yàn)檎{(diào)查了其中一個(gè),剩余的都可以安全到達(dá)(正確性顯然,因?yàn)槟阒灰踩{(diào)查了其中的一個(gè)人,你就可以通過(guò)每次確認(rèn)安全的人從而調(diào)查整個(gè)強(qiáng)連通分量),那么我們就可以tarjan一下,那么我們調(diào)查的對(duì)象就為縮點(diǎn)后入度為0的點(diǎn)(因?yàn)槟銦o(wú)法從其他點(diǎn)通向這個(gè)點(diǎn),你只能通過(guò)調(diào)查其中一個(gè)未知身份的人來(lái)調(diào)查整個(gè)強(qiáng)連通分量,如果警察RP不好,第一個(gè)選中殺手,警察就GG了),所以調(diào)查的未知身份的人數(shù)就是這些點(diǎn)的數(shù)量。 坑點(diǎn): 存在這樣一種情況,至少有一個(gè)點(diǎn),且只有一個(gè)人,而且沒(méi)人認(rèn)識(shí)他,他也不認(rèn)識(shí)別人,或者他認(rèn)識(shí)的每個(gè)人都能被除他以外的其他人所認(rèn)識(shí)(即入度>1),那么我們調(diào)查完其他人后,他就是殺手(正確性顯然,對(duì)于第一種情況,考慮n=1就行,對(duì)于第二種情況,他認(rèn)識(shí)的人已經(jīng)被調(diào)查過(guò)了,而其他人自然也被調(diào)查過(guò),那么他自己就是剩下未調(diào)查的唯一可能的殺手)。 那么如何處理呢? 進(jìn)行特判,順便dfs一下,判斷是否屬于這種情況就可以啦 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 inline int read(){ 6 int sum(0); 7 char ch(getchar()); 8 for(;ch<'0'||ch>'9';ch=getchar()); 9 for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar()); 10 return sum; 11 } 12 struct edge{ 13 int s,e,n; 14 }a[300001],b[100001]; 15 int pre[100001],tot; 16 int adj[100001],ttt; 17 inline void insert(int s,int e){ 18 a[++tot].s=s; 19 a[tot].e=e; 20 a[tot].n=pre[s]; 21 pre[s]=tot; 22 } 23 inline void add(int s,int e){ 24 b[++ttt].s=s; 25 b[ttt].e=e; 26 b[ttt].n=adj[s]; 27 adj[s]=ttt; 28 } 29 int n,m; 30 int stack[100001],top; 31 int cnt,low[100001],dfn[100001],bl[100001],qlt; 32 bool vis[100001]; 33 int size[100001]; 34 inline int my_min(int a,int b){ 35 return a<b?a:b; 36 } 37 inline void tarjan(int u){ 38 cnt++; 39 vis[u]=1; 40 low[u]=dfn[u]=cnt; 41 stack[++top]=u; 42 for(int i=pre[u];i!=-1;i=a[i].n){ 43 int e(a[i].e); 44 if(!dfn[e]){ 45 tarjan(e); 46 low[u]=my_min(low[u],low[e]); 47 } 48 else 49 if(vis[e]) 50 low[u]=my_min(low[u],dfn[e]); 51 } 52 if(low[u]==dfn[u]){ 53 int tmp; 54 qlt++; 55 while(1){ 56 tmp=stack[top--]; 57 bl[tmp]=qlt; 58 vis[tmp]=0; 59 if(tmp==u) 60 break; 61 } 62 } 63 } 64 bool flag[100001]; 65 inline void uni(int u){//坑點(diǎn)處理dfs 66 for(int i=adj[u];i!=-1;i=b[i].n){ 67 int e(b[i].e); 68 if(!vis[e]){ 69 vis[e]=1; 70 uni(e); 71 size[u]+=size[e]; 72 } 73 } 74 } 75 int ans(0); 76 int ind[100001]; 77 int main(){ 78 // freopen("killer.in","r",stdin); 79 // freopen("killer.out","w",stdout); 80 memset(pre,-1,sizeof(pre)); 81 memset(adj,-1,sizeof(adj)); 82 n=read(),m=read(); 83 for(int i=1;i<=m;i++){ 84 int x(read()),y(read()); 85 insert(x,y); 86 } 87 for(int i=1;i<=n;i++) 88 if(!dfn[i]) 89 tarjan(i); 90 for(int i=1;i<=n;i++) 91 size[bl[i]]++; 92 for(int i=1;i<=m;i++){ 93 int s(a[i].s),e(a[i].e); 94 if(bl[s]!=bl[e]) 95 add(bl[s],bl[e]),ind[bl[e]]++; 96 } 97 for(int i=1;i<=qlt;i++) 98 if(!ind[i]){//坑點(diǎn)特判 99 uni(i); 100 if(size[i]==1){ 101 ans=-1; 102 break; 103 } 104 } 105 for(int i=1;i<=qlt;i++) 106 if(ind[i]==0) 107 ans++; 108 printf("%.6lf",(double)(n-ans)/(double)n); 109 } View Code 哀民生之多艱啊- -轉(zhuǎn)載于:https://www.cnblogs.com/hzoi-mafia/p/7276887.html
總結(jié)
以上是生活随笔為你收集整理的[补档][中山市选2011]杀人游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hashMap与hashTable区别
- 下一篇: 敏捷宣言遵循的原则