bzoj 2438 中山市選2011 殺人遊戲

2021-08-15 12:51:16 字數 1329 閱讀 2914

一位冷血的殺手潛入 na-wiat,並假裝成平民。警察希望能在 n 個人裡面,查出誰是殺手。警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人, 誰是殺手, 誰是平民。 假如查證的物件是殺手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看作他們是殺手的概率是相同的。問:根據最優的情況,保證警察自身安全並知道誰是殺手的概率最大是多少?

這道題是一道強聯通,是一道比較好的題目,與經典的題目有一點的小改動。首先,設gr為最少查證的人數,那麼概率就為(n-gr)/n。之後,這題有個特殊情況,如果有乙個點,它的入度為0,並自為乙個聯通分量,並與它相連的點都可以可以被其他給覆蓋的話,那麼它就無用,gr-1。

#include

#include

#include

#include

#include

using

namespace

std;

struct node

a[310000];int len,last[310000];

void ins(int x,int y)

int id,cnt,top;

int low[110000],dfn[110000],sta[110000],belong[110000],s[110000],ss[110000];

int ru[110000];

bool v[110000];

void dfs(int x)

else

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

while(i!=x);

}}

bool he(int x)

return

true;

}int main()

id=cnt=top=0;

memset(dfn,-1,sizeof(dfn));

memset(low,0,sizeof(low));

memset(belong,0,sizeof(belong));

memset(sta,0,sizeof(sta));

memset(v,false,sizeof(v));

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

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

}int gr=0;

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

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

}printf("%.6lf\n",(n-gr)*1.0/n*1.0);

return

0;}

bzoj2438 中山市選2011 殺人遊戲

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

BZOJ 2438 中山市選2011 殺人遊戲

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

2438 中山市選2011 殺人遊戲

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