• HDOJ 1269 迷宫城堡(tarjan模板题)


    Problem Description

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。

    Input

    输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。

    Output

    对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。

    Sample Input

    3 3
    1 2
    2 3
    3 1
    3 3
    1 2
    2 3
    3 2
    0 0

    Sample Output

    Yes
    No

    思路:

    就是找强连通分量的个数,若该连通图为强连通图,则该图仅有一个强连通分量。

    #include<bits/stdc++.h> 
    #define MAX 10005 
    using namespace std;  
    int dfn[MAX],low[MAX],inst[MAX],st[MAX],tot,sum,top;
    vector<int>G[MAX];
    void tarjan(int u)
    {
        int v;
        dfn[u]=low[u]=++tot;
        st[++top]=u;
        inst[u]=1;
        for(int i=0;i<G[u].size();i++)
        {
            v=G[u][i];
            if(!dfn[v])
            {
                tarjan(v);
                low[u]=min(low[u],low[v]); //找出父子结点对应关系 
            }
            else if(inst[v])               //如果访问过,并且还在栈里 
                low[u]=min(low[u],dfn[v]); //连接父子结点对应关系 
        }
        if(dfn[u]==low[u])                 //找到该强连通分量子树里的最小根 
        {
            sum++;                         //强连通分量个数sum 
            do{
                v=st[top--];
                inst[v]=0;
            }while(u!=v);
        }
    }
    void init()
    {
        for(int i=0;i<MAX;i++)
            G[i].clear();
        top=-1;
        sum=tot=0;
        memset(inst,0,sizeof(inst)); 
        memset(dfn,0,sizeof(dfn)); 
        memset(low,0,sizeof(low));     
    }
    int main()  
    {  
        int n,m,x,y,i;  
        while(cin>>n>>m,n||m) 
        {
            init();
            for(i=1;i<=m;i++)  
            {  
                scanf("%d%d",&x,&y);  
                G[x].push_back(y);
            }  
            for(i=1;i<=n;i++) 
                if(!dfn[i])
                    tarjan(i);
            if(sum==1)cout<<"Yes"<<endl;
            else cout<<"No"<<endl; 
        }
        return 0;  
    }
  • 相关阅读:
    去掉苹果设备中按钮的默认样式
    用纯css写三角形
    行内元素中间出现空隙
    控制字间距
    单选按钮只能选中一个
    ie6出现双倍边距的问题
    17-比赛1 B
    ACM模板
    STL 入门 (17 暑假集训第一周)
    UVA 1594 Ducci Sequence(紫书习题5-2 简单模拟题)
  • 原文地址:https://www.cnblogs.com/kannyi/p/8650101.html
Copyright © 2020-2023  润新知