hdoj 1269 迷宫城堡(强连通分量)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269

思路分析:该问题要求判断是否每两个房间都可以相互到达,即求该有向图中的所有点是否只构成一个强连通图分量,使用Tarjan算法即可求解;

代码如下:

#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int MAX_N = 10000 + 100;
vector<int> G[MAX_N];
stack<int> S;
int pre[MAX_N], lowlink[MAX_N], scc_no[MAX_N];
int dfs_clock, scc_cnt;

inline int Min(int a, int b) { return a < b ? a : b; }
void Dfs(int u)
{
    pre[u] = lowlink[u] = ++dfs_clock;
    S.push(u);

    for (int i = 0; i < G[u].size(); ++i)
    {
        int v = G[u][i];

        if (!pre[v])
        {
            Dfs(v);
            lowlink[u] = Min(lowlink[u], lowlink[v]);
        } else if (!scc_no[v])
            lowlink[u] = Min(lowlink[u], lowlink[v]);
    }
    if (lowlink[u] == pre[u])
    {
        scc_cnt++;
        for (;;)
        {
            int x = S.top();
            S.pop();
            scc_no[x] = scc_cnt;
            if (x == u)  break;
        }
    }
}

inline void FindScc(int n)
{
    dfs_clock = scc_cnt = 0;
    memset(pre, 0, sizeof(pre));
    memset(lowlink, 0, sizeof(lowlink));
    memset(scc_no, 0, sizeof(scc_no));
    for (int i = 1; i <= n; ++i)
    if (!pre[i]) Dfs(i);
}

int main()
{
    int ver_num, road_num;

    while (scanf("%d %d", &ver_num, &road_num) != EOF
        && (ver_num + road_num))
    {
        int ver_1, ver_2;

        for (int i = 0; i < MAX_N; ++i)
            G[i].clear( );
        for (int i = 0; i < road_num; ++i)
        {
            scanf("%d %d", &ver_1, &ver_2);
            G[ver_1].push_back(ver_2);
        }
        FindScc(ver_num);
        while (!S.empty( ))
            S.pop( );
        if (scc_cnt > 1)
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}
时间: 2024-10-23 00:47:52

hdoj 1269 迷宫城堡(强连通分量)的相关文章

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

迷宫城堡 强连通分量(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),每个通道都是单 向的,就是说若称某通道连通

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

hdu - 1269 迷宫城堡 (强连通裸题)

http://acm.hdu.edu.cn/showproblem.php?pid=1269 判断一个图是不是强连通,缩点之后判断顶点数是不是为1即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <algorithm> 7 #include <st

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> using namespace std; const int N = 10005; int n, m; vector<int> g[N], scc[N]; int pre[N], lowlink[N], sccno[N], d

hdu 1269 迷宫城堡 (tarjan算法学习)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7056    Accepted Submission(s): 3137 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个房

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 输入包含多组数据,输