迷宫城堡

连通图 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

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<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<cmath>

using namespace std;

#define N 10008

int n, m, cnt, num, top, Time; // Time用来计量时间,top用来控制stackk数组的下标
int dfn[N], low[N], stackk[N];  // dfn数组存到达下标的最小时间,low存下标可以走到的最小的点,stackk是自己建的栈,用来存深搜先后进入的点
bool instack[N];  // 判断是否进栈

vector<vector<int> > G;

void init()   // 初始化
{
    G.clear();
    G.resize(n+1);
    memset(dfn, 0, sizeof(dfn));
    memset(low, 0, sizeof(low));
    memset(stackk, 0, sizeof(stackk));
    memset(instack, false, sizeof(instack));
    cnt = num = top = Time = 0;
}

void Tarjan(int u)  // 从1点开始进栈,进栈一次Time更新
{
    low[u] = dfn[u] = ++Time;
    stackk[top++] = u;
    instack[u] = true;  // 已经进栈就标记true
    int len = G[u].size(), v;  

    for(int i = 0; i < len; i++)
    {
        v = G[u][i];  // 与进栈的点所连接的点

        if(!dfn[v])  // 如果这个点还没有被访问过,就把这个点遍历,low随之更新,是原先值和连接的这个值的low的最小值,因为low是指下标所能到的最小的点
        {
            Tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if(instack[v])  // 如果已经进栈,就直接判断low的取值就行了,
            low[u] = min(low[u], dfn[v]);
    }
    if(low[u] == dfn[u])  // 如果两个点的第一次到的时间值dfn和可以到的最小值dfn一样,说明不能再往下走了,这个连通图结束,开始出栈
    {
        do
        {
            num++;   // 出栈一个数num++,计量出栈总数
            v = stackk[--top];   // v用来存出栈的数,top--,
            instack[v] = false;  //  出栈置为false,虽然对本题没多大用
        }while(u != v);  // 当出栈是u时,出栈结束
        cnt++;   // 每 一次出栈,即每一个连通图,cnt++,
    }
}

void slove()
{
    Tarjan(1);

    if(cnt == 1 && num == n)  // 如果cnt等于1,就是就一个连通图。而且连通图内的总数是n,即把每个数都连接在内了,那么久是一个连通图,满足题意
        puts("Yes");
    else
        puts("No");
}

int main()
{
    while(scanf("%d%d", &n, &m), n+m)
    {
        int a, b;
        init();

        while(m--)
        {
            scanf("%d%d", &a, &b);
            G[a].push_back(b);  //
        }
        slove();
    }
    return 0;
}
时间: 2024-10-17 05:11:32

迷宫城堡的相关文章

迷宫城堡 -- 强联通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10908    Accepted Submission(s): 4887 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdoj 1269 迷宫城堡【scc基础题目】

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10156    Accepted Submission(s): 4570 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法

hdu1269 迷宫城堡 验证给出的有向图是不是强连通图... Tarjan算法板子题 Tarjan算法的基础是DFS,对于每个节点.每条边都搜索一次,时间复杂度为O(V+E). 算法步骤: 1.搜索到某一个点时,将该点的Low值标上时间戳,然后将自己作为所在强连通分量的根节点(就是赋值Dfn=Low=time) 2.将该点压入栈. 3.当点p有与点p'相连时,如果此时p'不在栈中,p的low值为两点的low值中较小的一个. 4.当点p有与点p'相连时,如果此时p'在栈中,p的low值为p的lo

hdu 1269 迷宫城堡 强连通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12778    Accepted Submission(s): 5698 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu 1269 迷宫城堡

迷宫城堡 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 29   Accepted Submission(s) : 12 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房

hdu 1269 迷宫城堡 最简单的联通图题 缩点算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你

hdu 1269 迷宫城堡(Targin算法)

---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Swwubmission(s): 10884    Accepted Submission(s): 4878 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单

[HDU] 迷宫城堡 HDU - 1269

迷宫城堡 HDU - 1269 时限: 1000MS   内存: 32768KB   64位IO格式: %I64d & %I64u 问题描述 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j

迷宫城堡 强连通分量(scc-tarjan)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12923    Accepted Submission(s): 5777 Problem Description 为 了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单 向的,就是说若称某通道连通

[ACM] HDU 1269 迷宫城堡(Tarjan算法求强联通分量)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8099    Accepted Submission(s): 3623 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A