• Poj 1236 Network of Schools (Tarjan)


    题目链接:

      Poj 1236 Network of Schools

    题目描述:

      有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个网络才能够让所有学校被网络覆盖?2:至少要加几条线路就能做到在任意一个学校安装网络都可以覆盖全部学校?

    解题思路:

      先用Tarjan对强连通分量进行缩点,然后对缩点以后的图进行处理,统计图中节点出度为零的有多少,入度为零的有多少个?

      因为入度为零的点不能由其他的点到达,在每个入度为零的节点安装网络可以让所有学校被网络覆盖。

      全部学校在一个强连通图里面,就可以实现第二问,因为出度为零的节点不能到达其他节点,入度为零的点不能由其他节点进来,所以要对出度为零加出度,入度为零的便加入度即可。PS:当全图只有一个连通块的时候应该不用加边的。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <string>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn = 110;
     7 struct node
     8 {
     9     int to ,next;
    10 } edge[maxn*maxn];
    11 int head[maxn], dfn[maxn], low[maxn], in[maxn], out[maxn], id[maxn];
    12 int tot, cnt, top, time, instack[maxn], stack[maxn];
    13 void init ()
    14 {
    15     tot = top = 0;
    16     cnt = time = 0;
    17     memset (head, -1, sizeof(head));
    18     memset (dfn, 0, sizeof(dfn));
    19     memset (low, 0, sizeof(low));
    20     memset (in, 0, sizeof(in));
    21     memset (out, 0, sizeof(out));
    22     memset (id, 0, sizeof(id));
    23     memset (instack, 0, sizeof(instack));
    24     memset (stack, 0, sizeof(stack));
    25 }
    26 void Add (int from, int to)
    27 {
    28     edge[tot].to = to;
    29     edge[tot].next = head[from];
    30     head[from] = tot ++;
    31 }
    32 void Tarjan (int u)
    33 {
    34     dfn[u] = low[u] = ++time;
    35     instack[u] = 1;
    36     stack[top ++] = u;
    37     for (int i=head[u]; i!=-1; i=edge[i].next)
    38     {
    39         int v = edge[i].to;
    40         if (!dfn[v])
    41             Tarjan (v);
    42         if (instack[v])
    43             low[u] = min (low[u], low[v]);
    44     }
    45     if (dfn[u] == low[u])
    46     {
    47         cnt ++;
    48         while (1)
    49         {
    50             int v = stack[--top];
    51             instack[v] = 0;
    52             id[v] = cnt;
    53             if (v == u)
    54                 break;
    55         }
    56     }
    57 }
    58 int main ()
    59 {
    60     int n;
    61     while (scanf ("%d", &n) != EOF)
    62     {
    63         init ();
    64         for (int i=1; i<=n; i++)
    65         {
    66             int to;
    67             while (scanf ("%d", &to), to)
    68                 Add (i, to);
    69         }
    70         for (int i=1; i<=n; i++)
    71             if (!dfn[i])
    72                 Tarjan (i);
    73         for (int i=1; i<=n; i++)
    74             for (int j=head[i]; j!=-1; j=edge[j].next)
    75             {
    76                 int v = id[i];
    77                 int u = id[edge[j].to];
    78                 if (v != u)
    79                 {
    80                     out[v] ++;
    81                     in[u] ++;
    82                 }
    83             }
    84         int In, Out;
    85         In = Out = 0;
    86         for (int i=1; i<=cnt; i++)
    87         {
    88             if (!in[i])
    89                 In ++;
    90             if (!out[i])
    91                 Out ++;
    92         }
    93         if (cnt == 1)
    94             printf ("1
    0
    ");
    95         else
    96             printf ("%d
    %d
    ", In, max(In, Out));
    97     }
    98     return 0;
    99 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    《J2EE的智能小区物业管理系统设计与实现》论文笔记(五)
    《基于.net的智能小区物业管理系统设计与实现》论文笔记(四)
    《基于SSH的小区物业管理系统设计与实现》论文笔记(三)
    《智能住宅小区物业管理系统设计与实现》论文笔记(二)
    《智能小区物业管理系统设计与实现》论文笔记(一)
    《轻量级响应式框架Vue.js应用分析》文献阅读(十)
    《Web2.0的研究与应用综述》文献阅读(九)
    《浅谈HTML5在中国的发展》文献阅读(八)
    《基于MVVM模式的WEB前端框架的研究》文献笔记(七)
    《Web新兴前端框架与模式研究》论文阅读(六)
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4661509.html
Copyright © 2020-2023  润新知