• Hdu 1269 强连通判定


    题目链接

    迷宫城堡

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 7097    Accepted Submission(s): 3159


    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
     Accepted Code:
     1 /*************************************************************************
     2     > File Name: hdu_1269.cpp
     3     > Author: Stomach_ache
     4     > Mail: sudaweitong@gmail.com
     5     > Created Time: 2014年08月06日 星期三 16时26分46秒
     6     > Propose: hdu 1269
     7  ************************************************************************/
     8 
     9 //强连通模板题
    10 #include <cmath>
    11 #include <string>
    12 #include <cstdio>
    13 #include <vector>
    14 #include <fstream>
    15 #include <cstring>
    16 #include <iostream>
    17 #include <algorithm>
    18 using namespace std;
    19 
    20 const int maxn = 10002;
    21 
    22 struct SCC {
    23     vector<int> G[maxn];
    24     vector<int> rG[maxn];
    25     vector<int> vs;
    26     bool used[maxn];
    27     int cmp[maxn];
    28     int n, m;
    29 
    30       void init(int n) {
    31           this->n = n;
    32           for (int i = 0; i < n; i++) {
    33               G[i].clear();
    34             rG[i].clear();
    35         }
    36         vs.clear();
    37     }
    38       void AddEdge(int from, int to) {
    39           G[from].push_back(to);
    40         rG[to].push_back(from);
    41     }
    42     void dfs(int u) {
    43           used[u] = true;
    44           for (int i = 0; i < (int)G[u].size(); i++) {
    45               if (!used[G[u][i]]) dfs(G[u][i]);
    46         }
    47         vs.push_back(u);
    48     }
    49     void rdfs(int u, int k) {
    50         cmp[u] = k;
    51           used[u] = true;
    52         for (int i = 0; i < (int)rG[u].size(); i++) {
    53               if (!used[rG[u][i]]) rdfs(rG[u][i], k);
    54         }
    55     }
    56     int find_scc() {
    57           memset(used, false, sizeof(used));
    58         for (int i = 0; i < n; i++) {
    59               if (!used[i]) dfs(i);
    60         }
    61         memset(used, false, sizeof(used));
    62         int k = 0;
    63         for (int i = (int)vs.size()-1; i >= 0; i--) {
    64               if (!used[vs[i]]) rdfs(vs[i], k++);
    65         }
    66         return k;
    67     }
    68 };
    69 
    70 SCC A;
    71 
    72 int main(void) {
    73       int n, m;
    74       while (~scanf("%d %d", &n, &m) && (n || m)) {
    75           A.init(n);
    76           while (m--) {
    77               int a, b;
    78             scanf("%d %d", &a, &b);
    79             a--; b--;
    80             A.AddEdge(a, b);
    81         }
    82         int k = A.find_scc();
    83         if (k == 1) puts("Yes");
    84         else puts("No");
    85     }
    86 
    87     return 0;
    88 }
  • 相关阅读:
    Leetcode---2. Add Two Numbers
    Leetcode---1. Two Sum
    dpkg:处理 xxx (--configure)时出错解决方案
    ubuntu 14.04搭建tensorflow-gpu开发环境
    Leetcode---35. Search Insert Position
    Leetcode---21. Merge Two Sorted Lists
    Leetcode----26. Remove Duplicates from Sorted Array
    Leetcode---28. Implement strStr()
    Leetcode----27 Remove Element
    qemu 安装 ubuntu-server 虚拟机
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/3899105.html
Copyright © 2020-2023  润新知