zoukankan      html  css  js  c++  java
  • poj 1236 Network of Schools

    强联通分量模版题,tarjan算法:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MAXN 110
     4 
     5 int n, p, ans1, ans2, u[MAXN*MAXN], v[MAXN*MAXN], next[MAXN*MAXN], first[MAXN];
     6 int dfn[MAXN], low[MAXN], col[MAXN], stk[MAXN], ins[MAXN], ind, top, cols, tmp;
     7 int indg[MAXN], outdg[MAXN], zeroin, zeroout;
     8 
     9 void dfs(int u)
    10 {
    11     dfn[u] = low[u] = ++ind;
    12     stk[++top] = u, ins[u] = 1;
    13     for(int i = first[u]; i != -1; i = next[i])
    14     {
    15         int ve = v[i];
    16         if(!dfn[ve])
    17         {
    18             dfs(ve);
    19             if(low[ve] < low[u]) low[u] = low[ve];
    20         }
    21         else if(ins[ve])
    22         {
    23             if(dfn[ve] < low[u]) low[u] = dfn[ve];
    24         }
    25     }
    26     if(dfn[u] == low[u])
    27     {
    28         cols ++;
    29         do
    30         {
    31             tmp = stk[top--];
    32             col[tmp] = cols;
    33             ins[tmp] = 0;
    34         }
    35         while(tmp != u);
    36     }
    37 }
    38 
    39 void tarjan(int n)
    40 {
    41     memset(dfn, 0, sizeof(dfn));
    42     memset(low, 0, sizeof(low));
    43     memset(col, 0, sizeof(col));
    44     memset(stk, 0, sizeof(stk));
    45     memset(ins, 0, sizeof(ins));
    46     ind = top = cols = 0;
    47     for(int i = 1; i <= n; i ++)
    48     {
    49         if(!dfn[i]) dfs(i);
    50     }    
    51     if(cols == 1)
    52     {
    53         ans1 = 1, ans2 = 0;
    54         return;
    55     }
    56     ans1 = ans2 = zeroin = zeroout = 0;
    57     memset(indg, 0, sizeof(indg));
    58     memset(outdg, 0, sizeof(outdg));
    59     for(int u = 1; u <= n; u ++)
    60     {
    61         for(int i = first[u]; i != -1; i = next[i])
    62         {
    63             int ve = v[i];
    64             if(col[u] == col[ve]) continue;
    65             indg[col[ve]] ++;
    66             outdg[col[u]] ++;
    67         }
    68     }
    69     for(int i = 1; i <= cols; i ++)
    70     {
    71         if(indg[i] == 0) zeroin ++;
    72         if(outdg[i] == 0) zeroout ++;
    73     }
    74     ans1 = zeroin;
    75     ans2 = zeroin > zeroout ? zeroin : zeroout;
    76 }
    77 
    78 int main()
    79 {
    80     while(~scanf("%d",&n))
    81     {
    82         memset(first, -1, sizeof(first));
    83         p = 0;
    84         for(int i = 1; i <= n; i ++)
    85             while(1)
    86             {
    87                 int a;
    88                 scanf("%d",&a);
    89                 if(a == 0) break;
    90                 u[p] = i; v[p] = a;
    91                 next[p] = first[u[p]];
    92                 first[u[p]] = p;
    93                 p ++;
    94             }
    95             tarjan(n);
    96             printf("%d\n%d\n",ans1, ans2);
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    一个机智的数组去重方法
    gets(),fgets()的作用机制探究
    性能优化之布局优化
    android 中theme和style的语法相关
    可以一直滚动的跑马灯
    ExpandableListView的OnitemLongclickListener事件
    关于 edittext 软键盘退出监听解决办法
    Android 开发之拦截EditText的输入内容,定制输入内容
    decimalFormat(小数格式)
    oracle常用
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2626217.html
Copyright © 2011-2022 走看看