zoukankan      html  css  js  c++  java
  • HDU 1269 迷宫城堡 tarjan算法求强连通分量

      基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等,那这个点就在一个强连通分量里面,此时从栈中向外取出元素,知道取出的元素与这个点的值相等时结束,我们所有取出的点与这个点在同一个强连通分量里。下面是代码,其实代码里本来不需要id数组记录点属于哪个强连通分量的,因为题目没有做要求,但是为了保留模板完整还是带着了,以供以后复习使用。

    #include<cstdio>
    #include<stack>
    #include<cstring>
    #include<iostream>
    using namespace std;
    #define maxn 10010
    struct EDGE
    {
        int to,nxt;
    }edge[maxn*10];
    int dfn[maxn],low[maxn],tot,num,id[maxn];
    int head[maxn];
    stack<int>s;
    void tarjan(int u,int fa)
    {
        dfn[u] = low[u] = ++tot;
        for(int i = head[u];i != -1;i = edge[i].nxt)
        {
            int v = edge[i].to;
            s.push(v);
            if(!dfn[v])
            {
                tarjan(v,u);
                low[u] = min(low[u],low[v]);
            }
            else if(id[v] == -1) low[u] = min(low[u],dfn[v]);
        }
        if(low[u] == dfn[u])
        {
            num++;
            while(!s.empty())
            {
                int num1 = s.top();
                s.pop();
                id[num1] = num;
                if(num1 == u)
                {
                    break;
                }
            }
        }
        return;
    }
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            if(!n && !m) break;
            memset(head,-1,sizeof(head));
            int a,b;
            for(int i = 0;i < m;i++)
            {
                scanf("%d%d",&a,&b);
                edge[i].to = b;
                edge[i].nxt = head[a];
                head[a] = i;
            }
            memset(dfn,0,sizeof(dfn));
            memset(low,0,sizeof(low));
            while(!s.empty()) s.pop();
            tot = 0,num = 0;
            memset(id,-1,sizeof(id));
            for(int i = 1;i <= n;i++)
            {
                if(!dfn[i]) s.push(i),tarjan(i,-1);
            }
            if(num == 1) puts("Yes");
            else puts("No");
        }
        return 0;
    }
  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/jifahu/p/5506255.html
Copyright © 2011-2022 走看看