bzoj2438 中山市選2011 殺人遊戲

2022-04-30 05:39:08 字數 1705 閱讀 5157

感覺今天狀態起飛了!!!之前留的坑一調就a了,舒服!!!

那麼這題之前一看就覺得,假如乙個人沒人認識實際上他必須查一下,那麼我第一次做的時候就把他抽象成了很多棵樹,然後我只查樹根,然後下面的每一層我都知道身份,那就沒有生命之憂了。然後特判一下有乙個人沒人認識tata也不認識別人,就是自己獨立出來的,那他最後留下來實際上不用查。

然後實際上這題怎麼可能這麼簡單,肯定會構環的,那麼就考慮強連通縮點,那麼這題難就難在怎麼判最後查剩乙個人的情況了,那麼具體怎麼做呢?首先這個點入度肯定為0的,再者這個聯通塊肯定是只有乙個點,不然還是需要問的,第三查他所能得知的點入度要》1,否則的話說明這個點必須通過當前這個點才能得知身份,還是需要查他。所以說這題細節還是很多的,搞得那時候感冒暈乎乎的。。。。

#include#include

#include

using

namespace

std;

intn,m;

struct

node

a[310000],e[310000];int len,last[1100000],elen,elast[1100000

];void ins(int x,int

y)void eins(int x,int

y)int id,dfn[1100000],low[1100000

];int top,sta[1100000

];int cnt,belong[1100000],size[1100000

];bool v[1100000

];void strong_unicom(int

x)

else

if(v[y]==true

)

}if(dfn[x]==low[x])

while(i!=x);

}}int ru[1100000

];bool check(int

x)

return

false;}

intmain()

id=0;top=0;cnt=0

; memset(dfn,

0,sizeof

(dfn));

memset(v,

false,sizeof

(v));

memset(size,

0,sizeof

(size));

for(int i=1;i<=n;i++)

if(dfn[i]==0

) strong_unicom(i);

memset(ru,

0,sizeof

(ru));

elen=0;memset(elast,0,sizeof

(elast));

for(int i=1;i<=m;i++)

}int sum=0

;

for(int i=1;i<=cnt;i++)

if(ru[i]==0)sum++;

for(int i=1;i<=cnt;i++)

if(ru[i]==0

)

if(check(i)==false)

printf(

"%.6lf\n

",1.0-double(sum)/double

(n));

return0;

}

bzoj 2438 中山市選2011 殺人遊戲

一位冷血的殺手潛入 na wiat,並假裝成平民。警察希望能在 n 個人裡面,查出誰是殺手。警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。假如查證的物件是殺手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看作他們是殺手...

BZOJ 2438 中山市選2011 殺人遊戲

一位冷血的殺手潛入 na wiat,並假裝成平民。警察希望能在 n 個人裡面,查出誰是殺手。警察能夠對每乙個人 進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。假如查證的物件是殺 手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看作他們是...

2438 中山市選2011 殺人遊戲

題目鏈結 題目大意 有n個人,其中乙個是殺手,可以詢問一些人,如果是殺手就會死,如果是平民,他會告訴你他認識的人中有誰是殺手有誰是平民,求自身安全並知道殺手的概率最大是多少 題解 某個人是殺手的概率相等。考慮到每個scc只問乙個點就可以,進行縮點,縮點後每個scc對答案貢獻等價。知道誰是殺手相當於知...