P4819 中山市選 殺人遊戲

2021-10-09 01:45:05 字數 1208 閱讀 6691

這題想必大家很容易想到圖論建模。每個人都是乙個結點,與他認識的人連一條邊,每過乙個點我們就能這樣擴充套件下去。我們需要使***殺的概率小,簡單貪心:盡量去找認識人多的人詢問,即找到聯通較多邊的那個結點詢問。我們可以求出途中所有的強連通分量,用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 個人裡面,查出誰是殺手。警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。假如查證的物件是殺手,殺手將會把警察乾掉。現在警察掌握了每乙個人認識誰。每乙個人都有可能是殺手,可看...