BZOJ 2438 中山市選2011 殺人遊戲

2022-04-30 12:27:14 字數 1897 閱讀 3638

一位冷血的殺手潛入 na-wiat,並假裝成平民。警察希望能在 n 個人裡面,查出誰是殺手。警察能夠對每乙個人

進行查證,假如查證的物件是平民,他會告訴警察,他認識的人, 誰是殺手, 誰是平民。 假如查證的物件是殺

手, 殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看作他們是殺手的概

率是相同的。問:根據最優的情況,保證警察自身安全並知道誰是殺手的概率最大是多少?

第一行有兩個整數 n,m。

接下來有 m 行,每行兩個整數 x,y,表示 x 認識 y(y 不一定認識 x,例如|hjt|同志) 。

僅包含一行乙個實數,保留小數點後面 6 位,表示最大概率。

5 41 2

1 31 4

1 50.800000

警察只需要查證 1。假如1是殺手,警察就會被殺。假如 1不是殺手,他會告訴警

察 2,3,4,5 誰是殺手。而 1 是殺手的概率是 0.2,所以能知道誰是殺手但沒被殺的概

率是0.8。對於 100%的資料有 1≤n ≤ 10 0000,0≤m ≤ 30 0000

資料已加強!

考慮如果這個圖是一顆樹 , 那麼肯定選樹根是最優的(有向的樹)。

由於乙個強連通分量裡的點只要知道乙個就可以知道所有的點 , 而且選每個點的代價都是 1/n

所以可以tarjan縮點 , 將圖變成乙個dag那麼最優方案要算的點就是dag上每個有根樹的根節點。

也就是入度為0的點的個數。

但是有可能存在這種情況:知道了n-1個點的身份,還剩乙個。

那麼剩的這個點的所有兒子一定是都可以根據其他的點(也就是除了根以外的點)來知道身份。

顯然,這樣的點最多只能有乙個。

#include#include#include#include#include#include#include#include#includeusing namespace std;

const int n = 1e5+10;

inline int read()

int n , m , cnt , top , tot , num;

int head[n] , vis[n] , sta[n] , dfn[n] , low[n] , col[n] , du[n];

vectorv[n];

struct edge e[n*3];

inline void add(int u , int v)

void tarjan(int x)

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

return ;

}int main()

for(int i = 1 , u , v ; i <= m ; ++i) u = read() , v = read() , add(u , v);

for(int i = 1 ; i <= n ; ++i) if(!dfn[i]) tarjan(i);

if(num == 1)

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

if(col[e[i].u] != col[e[i].v])

v[col[e[i].u]].push_back(col[e[i].v]) , du[col[e[i].v]]++;

int ans = 0;

for(int i = 1 ; i <= num ; ++i) if(du[i] == 0) ans++;

int flag1 = 0 , flag2 = 0;

for(int i = 1 ; i <= num ; ++i) if(du[i] == 0)

if(flag2)

} printf("%.6f\n" , 1.0 - (1.0 * (ans - flag1) * (1.0 / n)));

return 0;

}

bzoj 2438 中山市選2011 殺人遊戲

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

bzoj2438 中山市選2011 殺人遊戲

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

2438 中山市選2011 殺人遊戲

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