感覺今天狀態起飛了!!!之前留的坑一調就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對答案貢獻等價。知道誰是殺手相當於知...