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也不認識別人,就是自己獨立出來的,那他最後留...