POJ 1236

Network of Schools










Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 10500   Accepted: 4189

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 if B is in the distribution list of school A, then A does
not necessarily appear in the list of school B 
You are to write a
program that computes the minimal number of schools that must receive a copy of
the new software in order for the software to reach all schools in the network
according to the agreement (Subtask A). As a further task, we want to ensure
that by sending the copy of new software to an arbitrary school, this software
will reach all schools in the network. To achieve this goal we may have to
extend the lists of receivers by new members. Compute the minimal number of
extensions that have to be made so that whatever school we send the new software
to, it will reach all other schools (Subtask B). One extension means introducing
one new member into the list of receivers of one school.

Input

The first line contains an integer N: the number
of schools in the network (2 <= N <= 100). The schools are identified by
the first N positive integers. Each of the next N lines describes a list of
receivers. The line i+1 contains the identifiers of the receivers of school i.
Each list ends with a 0. An empty list contains a 0 alone in the line.

Output

Your program should write two lines to the
standard output. The first line should contain one positive integer: the
solution of subtask A. The second line should contain the solution of subtask
B.

Sample Input

5
2 4 3 0
4 5 0
0
0
1 0

Sample Output

1
2

Source

IOI
1996

强连通缩点,第一问是求入度为0的点,第二问是求入度为0和出度为0的点数 的最大值

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 #include <stack>
6
7 using namespace std;
8
9 const int MAX_N = 105;
10 int first[MAX_N],v[MAX_N * MAX_N],Next[MAX_N * MAX_N];
11 int low[MAX_N],pre[MAX_N],cmp[MAX_N];
12 int ind[MAX_N],oud[MAX_N];
13 int N;
14 int dfs_clock,scc_cnt;
15 stack<int > S;
16
17
18 void dfs(int u) {
19 low[u] = pre[u] = ++dfs_clock;
20 S.push(u);
21 for(int e = first[u]; e != -1; e = Next[e]) {
22 if(!pre[ v[e] ]) {
23 dfs(v[e]);
24 low[ u] = min(low[u],low[ v[e] ]);
25 } else {
26 if(!cmp[ v[e] ]) {
27 low[u] = min(low[u],pre[ v[e] ]);
28 }
29 }
30 }
31
32 if(low[u] == pre[u]) {
33 ++scc_cnt;
34 for(;;) {
35 int x = S.top(); S.pop();
36 cmp[x] = scc_cnt;
37 if(x == u) break;
38 }
39 }
40 }
41 void scc() {
42 dfs_clock = scc_cnt = 0;
43 memset(cmp,0,sizeof(cmp));
44 memset(pre,0,sizeof(pre));
45
46 for(int i = 1; i <= N; ++i) if(!pre[i]) dfs(i);
47 }
48
49 void add_edge(int id,int u) {
50 int e = first[u];
51 Next[id] = e;
52 first[u] = id;
53 }
54
55 void solve() {
56 scc();
57 for(int i = 1; i <= N; ++i) {
58 for(int e = first[i]; e != -1; e = Next[e]) {
59 if(cmp[ v[e] ] == cmp[i]) continue;
60 ind[ cmp[ v[e] ] ]++;
61 oud[ cmp[i] ]++;
62 }
63 }
64 int in = 0,ou = 0;
65 for(int i = 1; i <= scc_cnt; ++i) {
66 if(!ind[i]) in++;
67 if(!oud[i]) ou++;
68 }
69 printf("%d\n%d\n",in,scc_cnt == 1 ? 0 : max(in,ou));
70
71 }
72 int main()
73 {
74 //freopen("sw.in","r",stdin);
75
76 scanf("%d",&N);
77 int len = 0;
78 for(int i = 1; i <= N; ++i) first[i] = -1;
79
80 for(int i = 1; i <= N; ++i) {
81 int ch;
82 scanf("%d",&ch);
83 while(ch != 0) {
84 // printf("%d ",ch);
85
86 add_edge(len,i);
87 v[len++] = ch;
88 scanf("%d",&ch);
89 }
90 //cout << endl;
91 }
92
93 solve();
94 //cout << "Hello world!" << endl;
95 return 0;
96 }

POJ 1236,布布扣,bubuko.com

时间: 2024-12-27 17:55:47

POJ 1236的相关文章

POJ 1236——Network of Schools——————【加边形成强连通图】

Network of Schools Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1236 Description A number of schools are connected to a computer network. Agreements have been developed among those schools: e

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 这个题的大意是求最少往多少点发送消息可以使任意一个点都能收到消息和最少增加多少条边可以使图为连通图.对于第一个问题,可以求入度为0的强连通块的块数,因为只有入度为0的强连通块是无法从外界接受信息的,而只要有一个入度的话,那整个连通块就都可以接收到信息.第二个问题则是求入度为0的强连通块与出度为0的强连通块的个数的最大值. 代码如下: #include <iostream> #include <cstdio> #include <string>

[POJ 1236][IOI 1996]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 if B is in the

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

POJ 1236 学校网络间的强连通

题目大意: N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件. 链接http://vjudge.net/problem/viewProblem.action?id=17001 每个强连通分量内只要有任意一个学校获得一份软件就可以了,因为强连通分量内的任意两点是相互可达

Poj 1236 Network of Schools (Tarjan)

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

POJ 1236 Network of Schools - 缩点

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