zoukankan      html  css  js  c++  java
  • HDU_3836 Equivalent Set (Trajan 强连通分量 缩点)

      求出强连通分量,缩点。得到新图DAG, 求DAG中max(入度为0的点数,出度为0的点数);

    渣代码:

    View Code
      1 #include <iostream>
    2 #include <cstdio>
    3 #include <cstring>
    4 #include <stack>
    5
    6 using namespace std;
    7
    8 const int N = 20010;
    9 const int M = 50010;
    10
    11 struct node {
    12 int to;
    13 node* next;
    14 } *first[M];
    15
    16 int head[N], blong[N];
    17 int dfn[N], low[N];
    18 int in[N], out[N];
    19 int cnt, t, ind;
    20 bool vis[N];
    21
    22 stack<int> s;
    23
    24 void init() {
    25 memset(head, 0, sizeof(head));
    26 memset(blong, 0, sizeof(blong));
    27 memset(dfn, 0, sizeof(dfn));
    28 memset(low, 0, sizeof(low));
    29 memset(out, 0, sizeof(out));
    30 memset(vis, 0, sizeof(vis));
    31 memset(in, 0, sizeof(in));
    32 memset(first, NULL, sizeof(first));
    33
    34 t = 1; ind = cnt = 0;
    35 }
    36
    37 void add(int u, int v) {
    38 node *tmp = new node;
    39 tmp->to = v;
    40 tmp->next = first[u];
    41 first[u] = tmp;
    42 }
    43
    44 void tarjan(int u) {
    45 int v;
    46 vis[u] = true;
    47 s.push(u);
    48 low[u] = dfn[u] = ++ind;
    49 for(node* pos = first[u]; pos != NULL; pos = pos->next) {
    50 v = pos->to;
    51 if(!dfn[v]) {
    52 tarjan(v);
    53 low[u] = min(low[v], low[u]);
    54 } else if(vis[v]) {
    55 low[u] = min(low[u], low[v]);
    56 }
    57 }
    58 if(low[u] == dfn[u]) {
    59 cnt++;
    60 do {
    61 v = s.top(); s.pop();
    62 blong[v] = cnt;
    63 vis[v] = false;
    64 //printf("%d %d\n", v, cnt);
    65 } while(v != u);
    66 }
    67 }
    68
    69 int main() {
    70 //freopen("data.in", "r", stdin);
    71
    72 int n, m, a, b, i;
    73 while(~scanf("%d%d", &n, &m)) {
    74 init();
    75 for(i = 1; i <= m; i++) {
    76 scanf("%d%d", &a, &b);
    77 add(b, a);
    78 }
    79
    80 for(i = 1; i <= n; i++) {
    81 if(!dfn[i]) tarjan(i);
    82 }
    83 if(cnt == 1) { printf("0\n"); continue;} //注意,只有一个强连通分量时
    84 for(i = 1; i <= n; i++) {
    85 for(node* p = first[i]; p != NULL; p = p->next) {
    86 a = p->to;
    87 if(blong[i] != blong[a]) {
    88 in[blong[a]] ++;
    89 out[blong[i]] ++;
    90 }
    91 }
    92 }
    93 a = b = 0;
    94 for(i = 1; i <= cnt; i++) {
    95 if(!in[i]) a++;
    96 if(!out[i]) b++;
    97 }
    98 printf("%d\n", max(a, b));
    99 }
    100 return 0;
    101 }



  • 相关阅读:
    数据的增、删、改(jQuery.Ajax)
    tomcat内置jdk(tomcat集成jdk)(windows环境)
    进行数据库进程的杀死
    矩阵与自然基向量
    实对称矩阵
    坐标变换
    设置PySpark的Python版本
    CentOS7中安装Python3.6
    一个矩阵有几个实特征向量
    centos7系统设置固定IP
  • 原文地址:https://www.cnblogs.com/vongang/p/2347058.html
Copyright © 2011-2022 走看看