标签:输入 max node 游戏 bre status 包含 iat break
5 4
1 2
1 3
1 4
1 5
0.800000
警察只需要查证 1。假如1是杀手,警察就会被杀。假如 1不是杀手,他会告诉警察 2,3,4,5 谁是杀手。而 1 是杀手的概率是 0.2,所以能知道谁是杀手但没被杀的概率是0.8。对于 100%的数据有 1≤N ≤ 10 0000,0≤M ≤ 30 0000
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+5; struct node{ int to,nx; }p[maxn*3]; struct node2{ int to,nx; }q[maxn*3]; int n,m,dfn[maxn],low[maxn],head[maxn],tot,vis[maxn],scc[maxn],cnt,sz[maxn],d[maxn],head2[maxn]; double ans; void addedge(int s,int t){ p[++tot].to=t,p[tot].nx=head[s],head[s]=tot; } void addedge2(int s,int t){ d[t]++; q[++tot].to=t,q[tot].nx=head2[s],head2[s]=tot; } stack<int>sk; void tarjan(int cur){ dfn[cur]=low[cur]=++tot; sk.push(cur); vis[cur]=1; for(int i=head[cur];i;i=p[i].nx){ int to=p[i].to; if(!dfn[to]){ tarjan(to); low[cur]=min(low[cur],low[to]); } else if(!scc[to])low[cur]=min(low[cur],dfn[to]); } if(dfn[cur]==low[cur]){ int now; cnt++; do{ now=sk.top(); sk.pop(); vis[now]=0; scc[now]=cnt; sz[cnt]++; }while(now!=cur); } } int ok(int cur){ if(d[cur]||sz[cur]!=1)return 0; for(int i=head2[cur];i;i=q[i].nx){ if(d[q[i].to]==1)return 0; } return 1; } void rebuild(){ for(int i=1;i<=n;i++){ for(int j=head[i];j;j=p[j].nx){ if(scc[i]!=scc[p[j].to])addedge2(scc[i],scc[p[j].to]); } } } int main() { cin>>n>>m; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; addedge(u,v); } tot=0; for(int i=1;i<=n;i++){ if(!dfn[i])tarjan(i); } tot=0; rebuild(); for(int i=1;i<=cnt;i++){ if(!d[i])ans++; } for(int i=1;i<=cnt;i++){ if(ok(i)){ ans--; break; } } printf("%.6f",(double)(n-ans)/(double)n); return 0; }
标签:输入 max node 游戏 bre status 包含 iat break
原文地址:https://www.cnblogs.com/czy-power/p/10556144.html