POJ 1236 Network of Schools —— (缩点的应用)

  题目大意:有N个学校和一些有向边将它们连结,求:

    1.最少需要向几个学校发放软件,使得他们中的每一个学校最终都能够获得软件。

    2.最少需要增加几条有向边使得可以从任意一个学校发放软件,使得每一个学校最终都能够获得软件。

  分析:

    1.缩点以后,找出入度为0的点的个数即可(因为没人可以给他们软件)。

    2.缩点以后,答案即是max(入度为0的点,出度为0的点)。因为只要另每一对入度为0和出度为0的点相连接即可。

  第二个问题也有无向图的版本,那样的话处理方法是:缩点以后,找出那些度为1的点,个数为cnt,向上整除2即可(即答案为(cnt+1)/2)。

  代码如下:

  1 #include <stdio.h>
  2 #include <stack>
  3 #include <algorithm>
  4 #include <string.h>
  5 #include <vector>
  6 using namespace std;
  7
  8 const int N = 100+5;
  9
 10 stack<int> S;
 11 int scc_cnt;  //强连通分量的个数
 12 int dfs_clock;    //访问到该节点的时间戳
 13 int belong[N];  //belong[i]表示i节点所属于第几个强连通分量
 14 int dfn[N];     //表示第i个节点被访问的时间
 15 int low[N];    //表示第i个节点的子节点所能访问到的最小的dfn值
 16 vector<int> G[N];
 17 int in[100+5],out[100+5];
 18
 19 void dfs(int u)
 20 {
 21     dfn[u] = low[u] = ++dfs_clock;
 22     S.push(u);
 23     for(int i=0;i<G[u].size();i++)
 24     {
 25         int v = G[u][i];
 26         if(!dfn[v])
 27         {
 28             dfs(v);
 29             low[u] = min(low[u],low[v]);
 30         }
 31         else if(!belong[v])
 32         {
 33             low[u] = min(low[u],low[v]);
 34         }
 35     }
 36     if(low[u]==dfn[u])
 37     {
 38         scc_cnt++;
 39         for(;;)
 40         {
 41             int x = S.top();S.pop();
 42             belong[x] = scc_cnt;
 43             if(x==u) break;
 44         }
 45     }
 46 }
 47
 48 void scc(int n)
 49 {
 50     memset(dfn,0,sizeof(dfn));
 51     memset(belong,0,sizeof(belong));
 52     dfs_clock = scc_cnt = 0;
 53     for(int i=1;i<=n;i++)
 54     {
 55         if(!dfn[i]) dfs(i);
 56     }
 57 }
 58
 59 int main()
 60 {
 61     int n;
 62     while(scanf("%d",&n)==1)
 63     {
 64         memset(in,0,sizeof(in));
 65         memset(out,0,sizeof(out));
 66         for(int i=1;i<=n;i++) G[i].clear();
 67         for(int i=1;i<=n;i++)
 68         {
 69             int to;
 70             while(scanf("%d",&to)==1&&to)
 71             {
 72                 G[i].push_back(to);
 73             }
 74         }
 75
 76         scc(n);
 77         if(scc_cnt==1)
 78         {
 79             puts("1\n0");
 80             continue;
 81         }
 82         for(int i=1;i<=n;i++)
 83         {
 84             for(int j=0;j<G[i].size();j++)
 85             {
 86                 int v = G[i][j];
 87                 if(belong[i]==belong[v]) continue;
 88                 in[belong[v]]++;
 89                 out[belong[i]]++;
 90             }
 91         }
 92         int incnt=0,outcnt=0;
 93         for(int i=1;i<=scc_cnt;i++)
 94         {
 95             if(!in[i]) incnt++;
 96             if(!out[i]) outcnt++;
 97         }
 98         printf("%d\n%d\n",incnt,max(incnt,outcnt));
 99     }
100     return 0;
101 }
时间: 2024-10-21 15:57:34

POJ 1236 Network of Schools —— (缩点的应用)的相关文章

POJ 1236 Network of Schools - 缩点

POJ 1236 :http://poj.org/problem?id=1236 参考:https://www.cnblogs.com/TnT2333333/p/6875680.html 题意: 有好多学校,每个学校可以给其他特定的学校发送文件.第一个问题是最少要给几个学校发文件,可以使得全部的学校收到文件.第二个问题是最少要加几条线路,使得随意挑一个学校发文件,也能使得全部的学校收到文件. 思路: 第一个问题,可以用tarjan给图中先缩点,因为强连通的环相互可达.所以只要数出缩完点后图中入度

POJ 1236 Network of Schools(强连通 Tarjan+缩点)

POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入?几条边使得有向图成为一个强连通图. 分析: 跟HDU 2767 Proving Equivalences(题解)一样的题目,只是多了个问题,事实上转化成DAG后就不难考虑了,事实上仅仅要选择入度为0的点即可了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> *

POJ 1236 Network of Schools(强连通分量)

POJ 1236 Network of Schools 链接:http://poj.org/problem?id=1236 题意:有一些学校连接到一个计算机网络.这些学校之间达成了一个协议:每个学校维护着一个学校列表,它向学校列表中的学校发布软件.注意,如果学校B 在学校A 的列表中,则A 不一定在B 的列表中. 任务A:计算为使得每个学校都能通过网络收到软件,你至少需要准备多少份软件拷贝. 任务B:考虑一个更长远的任务,想确保给任意一个学校发放一个新的软件拷贝,该软件拷贝能发布到网络中的每个学

poj 1236 Network of Schools 【强连通图】

题目:poj 1236 Network of Schools 类似题目hdoj 2767 3836 /*******以下kuang大神的解释,写的很好就不解释了*************************/ 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输,问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.2,至少需要添加几条传输线路(边),使任

Poj 1236 Network of Schools (Tarjan)

题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个网络才能够让所有学校被网络覆盖?2:至少要加几条线路就能做到在任意一个学校安装网络都可以覆盖全部学校? 解题思路: 先用Tarjan对强连通分量进行缩点,然后对缩点以后的图进行处理,统计图中节点出度为零的有多少,入度为零的有多少个? 因为入度为零的点不能由其他的点到达,在每个入度为零的节点安装网络可

poj 1236 Network of Schools(连通图入度,出度为0)

http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13046   Accepted: 5215 Description A number of schools are connected to a computer network. Agreements have been developed among those scho

[tarjan] poj 1236 Network of Schools

题目链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11433   Accepted: 4551 Description A number of schools are connected to a computer network. Agreements have been developed among thos

poj 1236 Network of Schools(tarjan+缩点)

Network of Schools Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes software (the “receiving schools”). Note that

POJ 1236 Network of Schools(强联通缩点)

Network of Schools Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes software (the “receiving schools”). Note that

POJ 1236 Network of Schools (Tarjan + 缩点)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12240   Accepted: 4871 Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a li