bzoj2438 杀人游戏 Tarjan强联通分量
2016-02-23 18:15
369 查看
显然知道谁是杀手相当于知道所有人的身份。因此题目的答案即在无向图中选择最少的点,使得能遍历到至少n-1个点(最后一个点可以推理得到)。设结果为x,则答案为(n-x)/n。
所以就可以用Tarjan找出强联通分量然后缩点,得到的DAG上入度为0的点即所要选择的点。如果存在某个点,这个点所在的强联通分量大小为1而且这个店所有的出边到达的点的入度都>1,那么这个点不选也可以遍历到n-1个点,x可以减一。
AC代码如下:
by lych
2016.2.23
所以就可以用Tarjan找出强联通分量然后缩点,得到的DAG上入度为0的点即所要选择的点。如果存在某个点,这个点所在的强联通分量大小为1而且这个店所有的出边到达的点的入度都>1,那么这个点不选也可以遍历到n-1个点,x可以减一。
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define N 100005 #define M 600005 using namespace std; int n,m,tot,cnt,tp,dfsclk,fst ,pnt[M],nxt[M],pos ,low ,stk ,scc ,sz ; int et ,u[M],v[M]; bool vis ; int read(){ int x=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x; } void add(int aa,int bb){ pnt[++tot]=bb; nxt[tot]=fst[aa]; fst[aa]=tot; } void dfs(int x){ pos[x]=low[x]=++dfsclk; stk[++tp]=x; int p; for (p=fst[x]; p; p=nxt[p]){ int y=pnt[p]; if (!pos[y]){ dfs(y); low[x]=min(low[x],low[y]); } else if (!scc[y]) low[x]=min(low[x],pos[y]); } if (low[x]==pos[x]) for (cnt++; ; tp--){ sz[cnt]++; scc[stk[tp]]=cnt; if (stk[tp]==x){ tp--; break; } } } bool jdg(int x){ int p; for (p=fst[x]; p; p=nxt[p]) if (et[pnt[p]]==1) return 0; return 1; } int main(){ n=read(); m=read(); int i,j,p,ans=0; if (n==1){ puts("1.000000"); return 0; } for (i=1; i<=m; i++){ int x=read(),y=read(); add(x,y); } for (i=1; i<=n; i++) if (!pos[i]) dfs(i); m=0; for (i=1; i<=n; i++){ for (p=fst[i]; p; p=nxt[p]){ j=scc[pnt[p]]; if (!vis[j] && scc[i]!=j){ vis[j]=1; u[++m]=scc[i]; v[m]=j; } } for (p=fst[i]; p; p=nxt[p]) vis[scc[pnt[p]]]=0; } tot=0; for (i=1; i<=cnt; i++) fst[i]=0; for (i=1; i<=m; i++){ add(u[i],v[i]); et[v[i]]++; } for (i=1; i<=cnt; i++) if (!et[i]) ans++; for (i=1; i<=cnt; i++) if (!et[i] && sz[i]==1 && jdg(i)){ ans--; break; } printf("%.6f\n",(double)(n-ans)/n); return 0; }
by lych
2016.2.23
相关文章推荐
- 计算一个字符串的宽,高
- 午饭+晚饭
- Leetcode 62: Unique Paths
- C#调用windows api示例
- Kmeans算法介绍及其实现
- 树链剖分(三)(除了道馆之战——暂时可以告一段落了)
- IOS开发证书显示“此证书的签发者无效”解决方法
- MapReduce自定义数据类型
- Linux开发cocos2dx程序环境搭建
- angularJS写的简易日历,有待简化
- 子进程和父进程关系以及缓冲区应用
- 运行app时报java.lang.ClassNotFoundException
- respondsToSelector:的使用
- 添加依赖项目失败
- Matlab运行错误捕捉办法
- iOS小明开发笔记(二十一) (缓存机制NSUserDefaults)
- 【bzoj2039】[2009国家集训队]employ人员雇佣 最小割
- ES6新特性概览
- Category的主要知识点
- 决策树