标签:
http://poj.org/problem?id=2186
Description
Input
Output
Sample Input
3 3 1 2 2 1 2 3
Sample Output
1
先缩点(把强联通分量看为一个点), 判断出度为 0 的点有几个,如果大于 1 则输出 0, 否则输出 出度为零的点的个数
代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<queue> #include<stack> #include<algorithm> using namespace std; #define N 50005 struct node { int v, next; }a[N]; int Head[N], cnt; int dfn[N], low[N], Time, bnt, belong[N]; int Stack[N], InStack[N], top; void Init() { cnt = Time = bnt = top = 0; memset(Head, -1, sizeof(Head)); memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(Stack, 0, sizeof(Stack)); memset(InStack, 0, sizeof(InStack)); } void Add(int u, int v) { a[cnt].v = v; a[cnt].next = Head[u]; Head[u] = cnt++; } void Tarjar(int u) { int v; low[u] = dfn[u] = ++Time; InStack[u] = 1; Stack[top++] = u; for(int j=Head[u]; j!=-1; j=a[j].next) { v = a[j].v; if(!dfn[v]) { Tarjar(v); low[u] = min(low[u], low[v]); } else if(InStack[v]) low[u] = min(low[u], dfn[v]); } if(dfn[u]==low[u]) { bnt++; do { v = Stack[--top]; InStack[v] = 0; belong[v] = bnt; }while(u!=v); } } int main() { int n, m; while(scanf("%d%d", &n, &m)!=EOF) { int i, u, v; Init(); for(i=1; i<=m; i++) { scanf("%d%d", &u, &v); Add(u, v); } for(i=1; i<=n; i++) { if(!dfn[i]) Tarjar(i); } int Out[N]={0}; for(int i=1; i<=n; i++) { for(int j=Head[i]; j!=-1; j=a[j].next) { u = belong[i], v = belong[a[j].v]; if(u!=v) Out[u]++; } } int flag=0, Index; for(i=1; i<=bnt; i++) { if(!Out[i]) { flag++; Index = i; } } if(flag>1) printf("0\n"); else { int ans = 0; for(i=1; i<=n; i++) { if(belong[i]==Index) ans++; } printf("%d\n", ans); } } return 0; }
(连通图 缩点 强联通分支)Popular Cows -- poj --2186
标签:
原文地址:http://www.cnblogs.com/YY56/p/4747685.html