【USACO】The Cow Prom
【题目链接】
【算法】
tarjan求强连通分量
【代码】
#include<bits/stdc++.h> #define MAXN 20005 using namespace std; int i,N,M,u,v,id,cnt; int dfn[MAXN],low[MAXN],vis[MAXN]; vector<int> edge[MAXN]; stack<int> stk; void dfs(int u) { int i,to,sum; dfn[u] = low[u] = ++id; stk.push(u); vis[u] = 1; for (i = 0; i < edge[u].size(); i++) { to = edge[u][i]; if (!dfn[to]) { dfs(to); low[u] = min(low[u],low[to]); } else { if (vis[to]) low[u] = min(low[u],dfn[to]); } } if (dfn[u] == low[u]) { sum = 0; while (true) { sum++; vis[stk.top()] = 0; if (stk.top() == u) { stk.pop(); break; } stk.pop(); } cnt += (sum > 1); } } int main() { scanf("%d%d",&N,&M); for (i = 1; i <= M; i++) { scanf("%d%d",&u,&v); edge[u].push_back(v); } for (i = 1; i <= N; i++) { if (!dfn[i]) dfs(i); } printf("%d\n",cnt); return 0; }