会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
Firecoder
博客园
首页
新随笔
联系
订阅
管理
poj 2186 Popular Cows (强连通分量 tarjan)
poj 2186 Popular Cows
强连通分量 tarjan
http://poj.org/problem?id=2186
#include <iostream> #include "stdio.h" #include "string.h" using namespace std; struct node { int v, next; }edge[50000]; const int MAXV = 10001; int adj[MAXV], lp, low[MAXV], dfn[MAXV], out[MAXV], belong[MAXV], stack[MAXV], index, top, num; bool instack[MAXV]; void addedge(int u, int v) { edge[lp].v = v; edge[lp].next = adj[u]; adj[u] = lp++; } void tarjan(int u) { low[u] = dfn[u] = ++index; stack[++top] = u; instack[u] = true; for(int i = adj[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(instack[v]) low[u] = min(low[u], dfn[v]); } int tmp; if(low[u] == dfn[u]) { num++; do { tmp = stack[top--]; instack[tmp] = false; belong[tmp] = num; }while(tmp != u); } } int main() { int nv, ne, i, j, a, b; while(scanf("%d%d", &nv, &ne) != EOF) { num = top = index = lp = 0; memset(adj, -1, sizeof(adj)); memset(dfn, 0, sizeof(dfn)); memset(out, 0, sizeof(out)); memset(instack, false, sizeof(instack)); for(i = 0; i < ne; i++) { scanf("%d%d", &a, &b); addedge(a, b); } for(i = 1; i <= nv; i++) if(!dfn[i]) tarjan(i); for(i = 1; i <= nv; i++) for(j = adj[i]; j != -1; j = edge[j].next) if(belong[i] != belong[edge[j].v]) out[belong[i]]++; int ans = 0, cnt = 0, pos; for(i = 1; i <= num; i++) if(out[i] == 0) { cnt++; //记录出度为0的强连通分量的个数 pos = i; } if(cnt == 1) { for(i = 1; i <= nv; i++) if(belong[i] == pos) ans++; } cout << ans << endl; } return 0; }
posted @
2011-08-17 14:24
Firecoder
阅读(
146
) 评论(
0
)
收藏
举报
刷新页面
返回顶部
公告