【luogu P2863 [USACO06JAN]牛的舞會The Cow Prom】 題解
阿新 • • 發佈:2018-07-25
ring 題目 struct www. tar rom 鏈接 ack size
題目鏈接:https://www.luogu.org/problemnew/show/P2863
求強連通分量大小>自己單個點的
#include <stack> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100000 + 10; struct edge{ int next, to, from, len; }e[maxn<<2]; int head[maxn], cnt; int n, m, color[maxn], tong[maxn], num, tim, ans; int dfn[maxn], low[maxn]; bool vis[maxn]; stack<int> s; void add(int u, int v) { e[++cnt].from = u; e[cnt].to = v; e[cnt].next = head[u]; head[u] = cnt; } void tarjan(int x) { dfn[x] = low[x] = ++tim; s.push(x); vis[x] = 1; for(int i = head[x]; i != -1; i = e[i].next) { int v = e[i].to; if(!dfn[v]) { tarjan(v); low[x] = min(low[x], low[v]); } else if(vis[v]) { low[x] = min(low[x], low[v]); } } if(dfn[x] == low[x]) { color[x] = ++num; vis[x] = 0; while(s.top() != x) { color[s.top()] = num; vis[s.top()] = 0; s.pop(); } s.pop(); } } int main() { memset(head, -1, sizeof(head)); scanf("%d%d",&n,&m); for(int i = 1; i <= m; i++) { int u, v; scanf("%d%d",&u,&v); add(u,v); } for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i); for(int i = 1; i <= n; i++) tong[color[i]]++; for(int i = 1; i <= n; i++) if(tong[i] > 1) ans++; printf("%d",ans); return 0; }
【luogu P2863 [USACO06JAN]牛的舞會The Cow Prom】 題解