POJ2186 Popular Cows ,有向图, Tarjan算法

2015-07-20 17:41:08 · 作者: · 浏览: 3

题意:

给定一个有向图,求有多少个顶点是由任何顶点出发都可达的。

顶点数<= 10,000,边数 <= 50,000


定理:
有向无环图中唯一出度为0的点,一定可以由任何点出发均可达
(由于无环,所以从任何点出发往前走,必然终止于一个出度为0的点)



1. 求出所有强连通分量
2. 每个强连通分量缩成一点,则形成一个有向无环图DAG。
3. DAG上面如果有唯一的出度为0的点,则该点能被所有的点可达。那么该点所代表的连通分量上的所有的原图中的点,都能被原图中的所有点可达,则该连通分量的点数,就是答案。
4. DAG上面如果有不止一个出度为0的点,则这些点互相不可达,原问题无解,答案为0


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         using namespace std; const int maxn = 10000 + 100; vector
        
          g[maxn]; int dfn[maxn], low[maxn], belong[maxn], dfs_clock, scc_cnt, size[maxn]; stack
         
           s; int n, m; void dfs(int u){ dfn[u] = low[u] = ++dfs_clock; s.push(u); for(int i=0; i