這題想必大家很容易想到圖論建模。每個人都是乙個結點,與他認識的人連一條邊,每過乙個點我們就能這樣擴充套件下去。我們需要使***殺的概率小,簡單貪心:盡量去找認識人多的人詢問,即找到聯通較多邊的那個結點詢問。我們可以求出途中所有的強連通分量,用tarjan演算法縮點,然後找出所有入讀為0的點。
但這題有乙個小坑,那就是有乙個點是可以不用去查的。舉個例子:假設有100個人,已經查過了99個人,那麼剩下來那乙個人不用查詢。
1.該點大小為1
2.該點入度為0
3.通過這個點所能到達的點的入度都不為1
#include using namespace std;
const int max=300005;
int n,m;
int dfn[max],low[max],head[max];
int nxt[max],ver[max],bel[max],sz[max];//bel=belong sz=size
int sccn,tot,dft,din[max];
stackst;
bool ins[max];
double per;
int nver[max],nnxt[max],nhead[max],ntot;//縮點後的新圖
void add(int x,int y)
void new_add(int x,int y)
void tarjan(int x)
else
}if(low[x]==dfn[x])//開始找連通塊中的所有點
while (x!=y);
}}int main()
for(int i=1;i<=n;i++)
if (!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=nxt[j])
}int cnt0=0;
bool p=0;
for(int i=1;i<=sccn;++i)
if (cnt1==0)
p=1;}}
}if(p) cnt0--;
double ans=(double)cnt0*per;
ans=(double)1-ans;
cout
}
P4819 中山市選 殺人遊戲
一位冷血的殺手潛入na wiat,並假裝成平民。警察希望能在nn個人裡面,查出誰是殺手。警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。假如查證的物件是殺手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看作他們是殺手的概...
P4819 中山市選 Tarjan SCC
題意 傳送門 p4819 中山市選 殺人遊戲 題解若 x xx 認識 y yy,則從 x xx 向 y yy 連一條有向邊,得到一張有向圖。觀察發現,若存在環,那麼任取環上一點即可,則有 1 n 1 n1 n 的概率是殺手 否則,可獲取下乙個節點的身份,直到環上最後乙個節點或發現殺手。那麼使用 ta...
洛谷 P4819 中山市選 殺人遊戲 強連通分量
題目描述 一位冷血的殺手潛入na wiat,並假裝成平民。警察希望能在 n n 個人裡面,查出誰是殺手。警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。假如查證的物件是殺手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看...