一位冷血的殺手潛入na-wiat ,並假裝成平民。警察希望能在n個人裡面查出誰是殺手
警察能夠對每乙個人進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民
假如查證的物件是殺手,殺手將會把警察乾掉
現在警察掌握了每一乙個人認識誰。 每一乙個人都有可能是殺手,看作他們是殺手的概率是相同的
根據最優的情況,保證警察自身安全並知道誰是殺手的概率最大是多少?
每個人的認識關係都可以看作一條有向邊
而如果這些有向的關係變成了乙個環,我們就可以縮點了——
縮點後,調查任意乙個在同乙個強聯通分量中的人都可以知道這個分量中所有人的身份
另外,對於乙個有腦子的police,如果已經調查了除 \(i\) 之外的所有人都不是**,\(i\) 一定是**
遇到這種情況,我們就不需要調查了
於是我們判斷一下是否有這種誰都不認識的人存在
若存在,即可少調查一次。設縮點後的起始點(入度為0)的個數為x
\[ans=1-\dfrac
\]**:
#include#define n 100005
#define m 300005
using namespace std;
int n,m,u[m],v[m];
bool flag;
struct edge
edge[m<<1];
int cnt=0,head[n];
inline void add_edge(int from,int to)
templateinline void read(t &res)
int low[n],dfn[n],tms=0,co[n],col=0,sum[n];
stacksta;
void tarjan(int u)
else if(!co[v]) low[u]=min(low[u],dfn[v]);
} if(low[u]==dfn[u])
sta.pop(); }}
int rd[n];
double ans;
int main()
for(register int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
cnt=0;
memset(head,0,sizeof(head));
for(register int i=1;i<=m;++i)
for(register int u=1;u<=col;++u)
if(!yes) flag=1;
} if(!rd[u]) ans++;
} if(flag) ans--;
printf("%.6f\n",1.0-(double)ans/(double)n);
}
中山市選2011 殺人遊戲
我考試想的正解,但是.有疏漏 1.鄰接表的陣列又開小了 2.概率計算錯誤 正解就是tarjen 亂搞 1.這個圖可能是分片的圖,不一定是連通圖 2.對於其中的環進行縮點,然後在新建的圖上找indegree為0的點的數量sum,就是我們需要調查的人 稱之為張一帆 3.其中我們定義有 這樣的張一帆,它可...
中山市選2011 殺人遊戲
online judge bzoj 2438,luogu 4819 label tarjan縮點,概率,yy 一位冷血的殺手潛入 na wiat,並假裝成平民。警察希望能在 n 個人裡面,查出誰是殺手。警察能夠對每乙個人 進行查證,假如查證的物件是平民,他會告訴警察,他認識的人,誰是殺手,誰是平民。...
2438 中山市選2011 殺人遊戲
題目鏈結 題目大意 有n個人,其中乙個是殺手,可以詢問一些人,如果是殺手就會死,如果是平民,他會告訴你他認識的人中有誰是殺手有誰是平民,求自身安全並知道殺手的概率最大是多少 題解 某個人是殺手的概率相等。考慮到每個scc只問乙個點就可以,進行縮點,縮點後每個scc對答案貢獻等價。知道誰是殺手相當於知...