poj2553

题意:求出度为0的强连通分支。

分析:采用邻接阵的强连通分支tarjan模板。

View Code
const int maxn = 5005, maxm = 100005;

struct Edge
{
    int v, next;
}edge[maxm];

int n, m, ncount, idx;
int head[maxn];
int dfn[maxn], low[maxn];
bool vis[maxn], instk[maxn];
int stk[maxn], top, cpn_num, cpn[maxn];
int out[maxn];

void addedge(int a, int b)
{
    //printf("%d %d\n", a, b);
    edge[ncount].v = b;
    edge[ncount].next = head[a];
    head[a] = ncount++;
}

void tarjan(int u)
{
    vis[u] = true;
    stk[top++] = u;
    instk[u] = true;
    dfn[u] = low[u] = idx++;
    for (int i = head[u]; ~i; i = edge[i].next)
    {
        int v = edge[i].v;
        if (!vis[v])
        {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }else if (instk[v])
            low[u] = min(low[u], dfn[v]);
    }
    if (dfn[u] != low[u])
        return;
    int v;
    do
    {
        v = stk[--top];
        instk[v] = false;
        cpn[v] = cpn_num;
    }while(u != v);
    cpn_num++;
}

CALL:
        memset(head, -1, sizeof(head));
        memset(vis, 0, sizeof(vis));
        memset(instk, 0, sizeof(instk));
        memset(out, 0, sizeof(out));
        input();
        idx = 0;
        top = 0;
        cpn_num = 0;
        for (int i = 0; i < n; i++)
            if (!vis[i])
                tarjan(i);

转载于:https://www.cnblogs.com/rainydays/archive/2012/07/03/2574746.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值