• CSU1612Destroy Tunnels(强连通)传递闭包


    Destroy Tunnels

    原来早忘记了离散里含有这么一个叫传递闭包的东西

    矩阵A的闭包B = A U A^2 U A^3 U ... 

    所以这里直接如果A[i][j]!= 0,建边i->j跑一遍强连通,看是不是只有一个强连通分量,>=2说明不能所有点都!=0输出exists

    否则说明所有i->j(i!=j)都有B[i][j]!= 0输出not exists

     1 #include <map>
     2 #include <set>
     3 #include <stack>
     4 #include <queue>
     5 #include <cmath>
     6 #include <ctime>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 #define INF 0x3f3f3f3f
    16 #define inf (-((LL)1<<40))
    17 #define lson k<<1, L, (L + R)>>1
    18 #define rson k<<1|1,  ((L + R)>>1) + 1, R
    19 #define mem0(a) memset(a,0,sizeof(a))
    20 #define mem1(a) memset(a,-1,sizeof(a))
    21 #define mem(a, b) memset(a, b, sizeof(a))
    22 #define FIN freopen("in.txt", "r", stdin)
    23 #define FOUT freopen("out.txt", "w", stdout)
    24 #define rep(i, a, b) for(int i = a; i <= b; i ++)
    25 #define dec(i, a, b) for(int i = a; i >= b; i --)
    26  
    27 template<class T> T CMP_MIN(T a, T b) { return a < b; }
    28 template<class T> T CMP_MAX(T a, T b) { return a > b; }
    29 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
    30 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
    31 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
    32 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
    33  
    34 //typedef __int64 LL;
    35 typedef long long LL;
    36 const int MAXN = 11000;
    37 const int MAXM = 1100;
    38 const double eps = 1e-4;
    39 LL MOD = 1000000007;
    40  
    41 vector<int> G[MAXN];
    42 int pre[MAXN], lowlink[MAXN], sccno[MAXN], dfs_clock, scc_cnt;
    43 stack<int>S;
    44  
    45 void dfs(int u)
    46 {
    47     pre[u] = lowlink[u] = ++dfs_clock;
    48     S.push(u);
    49     int si = G[u].size();
    50     for(int i = 0; i < si; i ++)
    51     {
    52         int v = G[u][i];
    53         if(!pre[v]) {
    54             dfs(v);
    55             lowlink[u] = min(lowlink[u], lowlink[v]);
    56         }
    57         else if(!sccno[v]) {
    58             lowlink[u] = min(lowlink[u], pre[v]);
    59         }
    60     }
    61     if(lowlink[u] == pre[u]) {
    62         scc_cnt++;
    63         for(;;) {
    64             int x = S.top(); S.pop();
    65             sccno[x] = scc_cnt;
    66             if(x == u) break;
    67         }
    68     }
    69 }
    70  
    71  
    72 void find_scc(int n)
    73 {
    74     dfs_clock = scc_cnt = 0;
    75     mem0(sccno); mem0(pre);
    76     for(int i = 0; i < n; i ++ )
    77         if(!pre[i]) dfs(i);
    78 }
    79  
    80 int t, n, x;
    81  
    82 int main()
    83 {
    84     while(~scanf("%d", &t)) while(t--) {
    85         scanf("%d", &n);
    86         rep (i, 0, n) G[i].clear();
    87         rep (i, 0, n - 1) rep (j, 0, n - 1) {
    88             scanf("%d", &x);
    89             if(x) G[i].push_back(j);
    90         }
    91         find_scc(n);
    92         puts(scc_cnt == 1 ? "not exists" : "exists");
    93     }
    94     return 0;
    95 }
    96  
    View Code
  • 相关阅读:
    装饰器和表达生成式
    函数
    字符编码
    函数基础
    列表,字典与集合
    Linux Semaphore
    tp5安装easyWeChat
    wx.request
    小程序设计规范
    小程序的概念和特点
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/4499209.html
Copyright © 2020-2023  润新知