P4819 中山市選 殺人遊戲

2022-04-29 03:00:08 字數 1251 閱讀 4347

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

問:根據最優的情況,保證警察自身安全並知道誰是殺手的概率最大是多少?

首先縮點, 然後需要把縮完點後的dag上每個入度為0的點都詢問一次才行.

但是有一種特殊情況是有乙個入度為0的點, 它連線的點都不是必須需要它.這時就可以不詢問它了.

#include #include #include #include const int n = 1e5 + 5, m = 3e5 + 6;

class basegraph

} *head[n];

int du[n];

basegraph()

void addedge(int u, int v)

};class graph : public basegraph

if (dfn[u] == low[u])

}public:

double init(int n, int m)

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

if (not dfn[i])

tarjan(i);

basegraph* rg = new basegraph();

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

for (auto edge = head[u]; edge; edge = edge->nxt)

if (col[u] != col[edge->v])

rg->addedge(col[u], col[edge->v]);

int num_without_du = 0;

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

if (not rg->du[i])

num_without_du += 1;

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

if (not rg->du[col[u]] and siz[col[u]] == 1)

}if (not flag)

}return 1.0 - 1.0 * num_without_du / n;

}};int main ()

P4819 中山市選 殺人遊戲

這題想必大家很容易想到圖論建模。每個人都是乙個結點,與他認識的人連一條邊,每過乙個點我們就能這樣擴充套件下去。我們需要使 殺的概率小,簡單貪心 盡量去找認識人多的人詢問,即找到聯通較多邊的那個結點詢問。我們可以求出途中所有的強連通分量,用tarjan演算法縮點,然後找出所有入讀為0的點。但這題有乙個...

P4819 中山市選 Tarjan SCC

題意 傳送門 p4819 中山市選 殺人遊戲 題解若 x xx 認識 y yy,則從 x xx 向 y yy 連一條有向邊,得到一張有向圖。觀察發現,若存在環,那麼任取環上一點即可,則有 1 n 1 n1 n 的概率是殺手 否則,可獲取下乙個節點的身份,直到環上最後乙個節點或發現殺手。那麼使用 ta...

洛谷 P4819 中山市選 殺人遊戲 強連通分量

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