• hdu1269迷宫城堡 (强连通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<stdio.h>
    #include<iostream>
    #include<malloc.h>
    using namespace std;
    typedef struct nnn
    {
        int u;
        struct nnn *next;
    }*List,list;
    
    List linkList[10005];
    int stack[10005],sn;
    int dfn[10005],low[10005],vist[10005],deep,flog,n;
    void addNode(List &p,int uu)
    {
            List q=(List)malloc(sizeof(list));
            q->u=uu;
            q->next=p->next;
            p->next=q;
    }
    void DFS(int v)
    {
        List p=linkList[v]->next;
        deep++; vist[v]=1;
        stack[++sn]=v;
        dfn[v]=low[v]=deep;
    
        while(p!=NULL)
        {
            int u=p->u;
            if(vist[u]==0)
            {
                DFS(u);
                low[v]=(low[v]<low[u])?low[v]:low[u];
                if(flog) return ;
            }
            else  low[v]=(low[v]<dfn[u])?low[v]:dfn[u];
              p=p->next;
        }
        if(low[v]==dfn[v])//表示在栈中的当前点到栈顶的点组成一个强连通
        {
            if(v!=1)flog=1;//假设v!=1表明可能有多个强连通
            else if(sn!=n)flog=1;//v=1了可是这个强连通中点的个数为sn个
        }
    }
    int main()
    {
        int m,v,u;
        while(scanf("%d%d",&n,&m)>0&&n+m!=0)
        {
            for(int i=1; i<=n; i++)
            {
                linkList[i]=(List)malloc(sizeof(list));
                vist[i]=0; linkList[i]->next=NULL;
            }
            while(m--)
            {
                scanf("%d%d",&v,&u);
                addNode(linkList[v],u);
            }
            flog=0; deep=0; sn=0;
            DFS(1);
            if(flog)printf("No
    ");
            else printf("Yes
    ");
        }
    }
    


  • 相关阅读:
    磁盘读写监控
    system.stat[resource,<type>]
    zookeeper核心之基于 Curator 实现分布式锁
    zookeeper之服务端接收数据请求和集群模式下的处理流程
    zookeeper之事件触发
    zookeeper之客户端接收服务端处理完成的响应
    zookeeper之服务端接收请求处理流程
    zookeeper之Watcher的基本流程
    zookeeper原理之Leader选举完成之后的处理逻辑
    zookeeper原理之投票的网络通信流程
  • 原文地址:https://www.cnblogs.com/blfshiye/p/3780169.html
Copyright © 2020-2023  润新知