POJ 2186 Popular Cows 强连通
2014-05-14 16:39
357 查看
求出度为0,且其他分量都指向他的集合,
#include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 0x7FFFFFFF #define LINF 1000000000000000000LL #define eps 1e-8 typedef long long ll; const int maxn=55555; struct node{ int u,to,next; }e[maxn]; int head[maxn],edge; int id[maxn],q[maxn],dfn[maxn],low[maxn],num[maxn]; int n,m,tsp,qe,cnt; void init() { MST(head,-1); edge=0; } void addedge(int u,int v) { e[edge].u=u; e[edge].to=v; e[edge].next=head[u]; head[u]=edge++; } void tarjan(int u) { int i,v; dfn[u]=low[q[qe++]=u]=++tsp; for(i=head[u];i>=0;i=e[i].next) if(!dfn[v=e[i].to]) { tarjan(v); low[u]=min(low[u],low[v]); } else { if(id[v]<0) { low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]) { num[id[u]=++cnt]=1; while((v=q[--qe])!=u) ++num[id[v]=cnt]; } } void solve() { int i; tsp=qe=cnt=0; for(i=0;i<=n;++i) id[i]=-1,dfn[i]=0; for(i=1;i<=n;++i) if(!dfn[i]) tarjan(i); } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; init(); scanf("%d",&m); int u,v; REP(i,m) { scanf("%d%d",&u,&v); addedge(u,v); } solve(); int out[maxn]; CLR(out); REP(i,edge) { u=id[e[i].u],v=id[e[i].to]; if(u!=v) out[u]++; } int ans=0; int res; FOR(i,1,cnt) { if(!out[i]) ans++,res=i; } if(ans>1) cout<<0<<endl; else cout<<num[res]<<endl; } return 0; }
相关文章推荐
- POJ 2186 Popular Cows(强连通)
- poj2186 Popular Cows(强连通)
- POJ 2186 Popular Cows 强连通
- POJ 2186 Popular Cows(强连通)
- poj2186 Popular Cows --- 强连通
- 【POJ 2186 Popular Cows】+ 强连通
- poj 2186 Popular Cows(强连通)
- POJ 2186 Popular Cows(强连通)
- POJ 2186 Popular Cows(初学强连通)
- poj 2186 Popular Cows
- poj 2186 Popular Cows (强连通分量 tarjan)
- [ACM] POJ 2186 Popular Cows (强连通分量,Kosaraju算法知识整理)
- poj 2186 Popular Cows
- poj 2186——Popular Cows
- POJ 2186 Popular Cows(强连通分量)
- poj 2186 Popular Cows
- POJ 题目2186 Popular Cows(强连通分量,缩点)
- poj 2186 Popular Cows(tarjan + 强连通分量 + 缩点)
- POJ 2186 Popular Cows
- POJ 2186 Popular Cows 强连通分量 Kosaraju算法