[强联通] bzoj 2438: [中山市选2011]杀人游戏
2018-03-07 13:08
295 查看
bzoj 2438: [中山市选2011]杀人游戏:http://www.lydsy.com/JudgeOnline/problem.php?id=2438
太菜了 用11次提交才换来的一次AC qaq
强联通缩一下点
重新建边之后统计一下出入度
如果点的入度为0的话 需要询问的个数++
似乎 这样就结束了
但是记不记得
输入5 0的时候答案是0.200000
如果把前面4个点都问过了那第5个点不用问都知道是狼人了
所以还要特判!!!! ->死在这个地方了
如果它所有能到的点都有另外的点可以到达它
所以这个点就不用问了flag=true;
本地AC提交WA的同学试一下
输入1 0
输出1.000000
太菜了 用11次提交才换来的一次AC qaq
强联通缩一下点
重新建边之后统计一下出入度
如果点的入度为0的话 需要询问的个数++
似乎 这样就结束了
但是记不记得
输入5 0的时候答案是0.200000
如果把前面4个点都问过了那第5个点不用问都知道是狼人了
所以还要特判!!!! ->死在这个地方了
如果它所有能到的点都有另外的点可以到达它
所以这个点就不用问了flag=true;
本地AC提交WA的同学试一下
输入1 0
输出1.000000
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int x,y,next; }a[310000]; struct node2 { int x,y,next; }b[310000]; int last[110000],len=0; int dfn[110000],low[110000],id=0; int sta[1100000],top=0; int belong[110000],cnt=0; bool v[110000]; int con[110000]; int ru[110000]; void build(int x,int y) { len++; a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } void rebuild(int x,int y) { len++; b[len].x=x;b[len].y=y;b[len].next=last[x];last[x]=len; } void dfs(int x) { dfn[x]=low[x]=++id; v[x]=false;sta[++top]=x; for (int k=last[x];k;k=a[k].next) { int y=a[k].y; if (dfn[y]==0) { dfs(y); low[x]=min(low[x],low[y]); } else if (v[y]==false) low[x]=min(low[x],dfn[y]); } if (low[x]==dfn[x]) { cnt++; int i=0; con[cnt]=1; while (top>0&&i!=x) { i=sta[top]; belong[i]=cnt; if (i!=x) con[cnt]++; v[i]=true; sta[top]=0; top--; } } } int main() { //freopen("killer.in","r",stdin); //freopen("killer.out","w",stdout); int n,m; scanf("%d%d",&n,&m); memset(last,0,sizeof(last)); for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); build(x,y); } memset(v,true,sizeof(v)); for (int i=1;i<=n;i++) { if (dfn[i]==0) dfs(i); } int l=len; memset(last,0,sizeof(last));len=0; memset(ru,0,sizeof(ru)); for (int k=1;k<=l;k++) { if (belong[a[k].x]!=belong[a[k].y]) {rebuild(belong[a[k].x],belong[a[k].y]);ru[belong[a[k].y]]++;} } int ans=0; bool bk=false,flag=false; for (int i=1;i<=cnt;i++) { if (ru[i]==0) { if (con[i]==1) { bk=true; for (int k=last[i];k!=0;k=b[k].next) if (ru[b[k].y]==1) {bk=false;break;} } if (bk) flag=true; ans++; } } if (flag) ans--; printf("%.6lf\n",1.0-(1.0/(double)n*ans)); return 0; }
相关文章推荐
- BZOJ 2438 [中山市选2011] 杀人游戏 (图的联通,tarjan)
- bzoj 2438: [中山市选2011]杀人游戏 (强联通分量 Tarjan)
- bzoj2438: [中山市选2011]杀人游戏(强联通)
- [BZOJ 2438] [中山市选2011]杀人游戏 Tarjan缩点
- 【BZOJ2438】[中山市选2011]杀人游戏 Tarjan
- BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
- bzoj 2438 [中山市选2011]杀人游戏(SCC+概率)
- BZOJ 2438 [中山市选2011] 杀人游戏 题解与分析
- BZOJ2438: [中山市选2011]杀人游戏
- bzoj2438[中山市选2011]杀人游戏
- bzoj2438[中山市选2011]杀人游戏
- bzoj 2438: [中山市选2011]杀人游戏 强连通分量
- bzoj 2438: [中山市选2011]杀人游戏【tarjan】
- BZOJ 2438 中山市选2011 杀人游戏 Tarjan
- 【BZOJ2438】【中山市选2011】杀人游戏 强连通分量+期望
- [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
- bzoj 2438: [中山市选2011]杀人游戏(Tarjan)
- bzoj2438 [中山市选2011]杀人游戏(tarjan缩点)
- [BZOJ 2438] 中山市选2011 杀人游戏 · Tarjan