3180:The Cow Prom

問題文
http://poj.org/problem?id=3180

N頭の牛がM本のロープでつながれている。
タンクの周りを正しく踊れている牛のグループの数を求めよ。


































強連結成分分解して、含まれている頂点の数が2以上の強連結成分の数を数えた。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int n,m;
vector<int>G[10001],rG[10001];
bool used[10001];
vector<int>vs;

void add_edge(int from,int to){
  G[from].push_back(to);
  rG[to].push_back(from);
}

void dfs(int v){
  used[v]=true;
  for(int i=0;i<G[v].size();i++){
    if(!used[G[v][i]])dfs(G[v][i]);
  }
  vs.push_back(v);
}

int rdfs(int v,int d){
  used[v]=true;
  int res=d;
  for(int i=0;i<rG[v].size();i++){
    if(!used[rG[v][i]])res=max(res,rdfs(rG[v][i],d+1));
  }
  return res;
}

int scc(){
  fill(used,used+10001,false);
  vs.clear();
  for(int i=1;i<=n;i++)if(!used[i])dfs(i);
  
  fill(used,used+10001,false);
  
  int cnt=0;
  for(int i=vs.size()-1;i>=0;i--)
    if(!used[vs[i]] && rdfs(vs[i],1)>1)cnt++;
  
  return cnt;
}

int main(void){
  
  cin >> n >> m;
  
  for(int i=0;i<m;i++){
    int a,b;
    cin >> a >> b;
    add_edge(a,b);
  }
  
  cout << scc() << endl;
  
  return 0;
}