bzoj2438 殺人遊戲

2021-08-19 09:04:12 字數 1757 閱讀 8871

description

一位冷血的殺手潛入 na-wiat,並假裝成平民。警察希望能在 n 個人裡面,

查出誰是殺手。

警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他

認識的人, 誰是殺手, 誰是平民。 假如查證的物件是殺手, 殺手將會把警察乾掉。

現在警察掌握了每乙個人認識誰。

每乙個人都有可能是殺手,可看作他們是殺手的概率是相同的。

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

少?input

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

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

output

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

sample input

5 41 2

1 31 4

1 5sample output

0.800000

hint

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

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

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

資料已加強!

根據題目的意思就是我們要 詢問最少的人 知道其中n-1個人的情況

如果一圈人互相知道,我們就給他縮點

然後我們尋找沒有入度的點 每個縮點之後入度為0的點,都是我們要調查的點

有一種特殊情況 我們 有可能有乙個人 沒人認識他 或者他認識的人 我們通過其他人都可以了解到

那麼這個人也是不用調查的

這題其實理解題意很關鍵

一開始我 難以理解題意 不知道這個概率如何求 取決於 警察可能問乙個人 然後他的下場不是死就是活著 死亡=調查的未知身份的人數/總人數

#include#include#define n 110000

#define m 330000

using namespace std;

stackq;

inline int read()

return x;

}struct nodedata[m],data1[m];

int dfn[n],low[n],num,h[n],h1[n],s,b[n],size[n];bool stackf[n];

void tarjan(int x)

if (dfn[x]==low[x])while (y!=x); }}

int n,m,in[n];bool visit[n];

inline bool judge(int x)

int main()num=0;

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

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

} for (int j=h1[b[i]];j;j=data1[j].next) visit[data1[j].y]=false;

} double ans=0;

for (int i=1;i<=s;++i) if (!in[i]) ++ans;

for (int i=1;i<=s;++i) if (size[i]==1&&!in[i]&&judge(i))

printf("%.6lf",(n-ans)/n);

return 0;

}

bzoj 2438 殺人遊戲(tarjan縮點)

根據題意只要找出有多少個不連通的集合就可以了。但是在判定的時候有環的話會有點麻煩,所以先縮點,在dfs。但是如果有乙個點它的所有連的點不止它乙個入度的話 而且這個點的入度為0,那麼最後剩它的時候就不用問了。include include include includeusing namespace ...

bzoj 2438 中山市選2011 殺人遊戲

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

bzoj2438 中山市選2011 殺人遊戲

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