这个题很容易想到正解就是缩点找入度为零的点,那么我们考虑一种特殊情况就是,一个入度为零的点我们不访问他就知道他是不是凶手,那么这样的话就是:I. 他是一个真·孤立的点 II. 他在图里但是在他的强联通分量里只有他一个而且他能到达的所有点都能被其他入度为零的点所达到 ,这个细节70分.......

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define N 100010
#define M 300010
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct VIA
{
int to,next;
}c[M];
struct Via
{
int to,next,w;
}C[M<<];
int head[N],t,Head[N],T;
int dfn[N],low[N],stack[N],top;
inline void add(int x,int y)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
}
inline void Add(int x,int y,int z)
{
C[++T].to=y;
C[T].w=z;
C[T].next=Head[x];
Head[x]=T;
}
inline int Min(int x,int y)
{
return x<y?x:y;
}
int n,m,Ti,num,belong[N];
bool in[N];
bool special[N];
void Tarjan(int x)
{
in[x]=;
stack[++top]=x;
dfn[x]=low[x]=++Ti;
for(int i=head[x];i;i=c[i].next)
if(!dfn[c[i].to])
{
Tarjan(c[i].to);
low[x]=Min(low[x],low[c[i].to]);
}
else if(in[c[i].to])
low[x]=Min(low[x],dfn[c[i].to]);
if(low[x]==dfn[x])
{
int j,i=;
++num;
do
{
j=stack[top--];
in[j]=;
belong[j]=num;
i++;
}while(j!=x);
if(i==)
special[num]=;
}
}
int In[N];
inline void Build_New()
{
for(int x=;x<=n;x++)
for(int i=head[x];i;i=c[i].next)
if(belong[x]!=belong[c[i].to])
++In[belong[c[i].to]],Add(belong[x],belong[c[i].to],),Add(belong[c[i].to],belong[x],-);
}
inline void Init()
{
n=read(),m=read();
for(int i=,x,y;i<=m;i++)x=read(),y=read(),add(x,y);
}
int visit[N];
bool F(int x,int to)
{
if(visit[x]==t)return ;
if(In[x]==&&x!=to)return ;
for(int i=Head[x];i;i=C[i].next)
if(C[i].w==-)
if(F(C[i].to,to))
return ;
return ;
}
inline int find()
{
t=;
for(int i=;i<=num;i++)
if(In[i]==&&special[i])
{
if(Head[i]==)return ;
bool ans=;
for(int j=Head[i];j;j=C[j].next)
if(C[j].w==)
{
++t;
ans&=F(C[j].to,i);
}
if(ans)return ;
}
return ;
}
inline void work()
{
for(int i=;i<=n;i++)
if(!dfn[i])Tarjan(i);
Build_New();
int get=;
for(int i=;i<=num;i++)if(!In[i])get++;
get=n-get;
get+=find();
double ans=(double)get/n;
printf("%.6lf",ans);
}
int main()
{
Init();
work();
return ;
}

.

最新文章

  1. PHP 5.4 已废弃 magic_quotes_gpc,PHP安全转义函数详解(addslashes 、htmlspecialchars、htmlentities、mysql_real_escape_string、strip_tags)
  2. java获取日期 昨天 今天 明天的日期
  3. ListMultimap 容器
  4. AES加密算法C++实现
  5. I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题
  6. Gitlab备份、升级、恢复
  7. 在Navicat for MySQL中打开视图时,提示视图没有主键的问题
  8. SmartJS 第一期(0.1)发布 - AOP三剑客
  9. 【翻译】Kinect v2程序设计(C++) Color篇
  10. silverlight Frame嵌套页面刷新问题
  11. mysql学习笔记4
  12. PowerDesigner 的常用小技巧 转
  13. Zookeeper分享
  14. if __name__ == &#39;__main__&#39;在python中的应用
  15. Ubuntu 重装 mysql
  16. 微信小程序大全(下)(最新整理 建议收藏)
  17. python 实现词云
  18. Win10启动tomcat控制台乱码解决方案
  19. vue中使用refs定位dom出现undefined?
  20. Mybatis抛出:Cannot obtain primary key information from the database, generated objects may be incomplete

热门文章

  1. Hive(1)-基本概念
  2. react中事件冒泡之填坑
  3. java入门---简介&amp;简单输出小例子&amp;开发前准备
  4. 2 socket UDP通信
  5. 微信H5支付 在其他浏览器调用微信支付
  6. 深度学习(deep learning)优化调参细节(trick)
  7. 触发显示和隐藏 div
  8. python--基础篇二
  9. (原创)BFS广度优先算法,看完这篇就够了
  10. 1034 Head of a Gang (30 分)(图的遍历or并查集)