POJ 1236 Network of School

http://poj.org/problem?id=1236

题意:

给出一个图,至少要选多少个点才能遍历全图和至少需要添加多少边使得整个图是强连通。

思路:

强连通计算连通分量后缩点,计算入度为0的点和出度为0的点。

第一个答案就是出度为0的点,第二个就是max(出度,入度)。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 using namespace std;
11
12 const int maxn=100+5;
13
14 int n;
15
16 vector<int> G[maxn];
17 int in[maxn],out[maxn];
18 int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
19 stack<int> S;
20
21 void dfs(int u)
22 {
23     pre[u]=lowlink[u]=++dfs_clock;
24     S.push(u);
25     for(int i=0;i<G[u].size();i++)
26     {
27         int v=G[u][i];
28         if(!pre[v])
29         {
30             dfs(v);
31             lowlink[u]=min(lowlink[u],lowlink[v]);
32         }
33         else if(!sccno[v])
34         {
35             lowlink[u]=min(lowlink[u],pre[v]);
36         }
37     }
38     if(lowlink[u]==pre[u])
39     {
40         scc_cnt++;
41         for(;;)
42         {
43             int x=S.top(); S.pop();
44             sccno[x]=scc_cnt;
45             if(x==u)  break;
46         }
47     }
48 }
49
50 void find_scc()
51 {
52     dfs_clock=scc_cnt=0;
53     memset(sccno,0,sizeof(sccno));
54     memset(pre,0,sizeof(pre));
55     for(int i=1;i<=n;i++)
56         if(!pre[i])  dfs(i);
57 }
58
59
60 int main()
61 {
62     //freopen("D:\\input.txt","r",stdin);
63     while(~scanf("%d",&n))
64     {
65         for(int i=1;i<=n;i++)  G[i].clear();
66         for(int u=1;u<=n;u++)
67         {
68             while(true)
69             {
70                 int x;
71                 scanf("%d",&x);
72                 if(x==0)  break;
73                 G[u].push_back(x);
74             }
75         }
76         find_scc();
77
78         for(int i=1;i<=scc_cnt;i++)   in[i]=out[i]=1;
79         for(int u=1;u<=n;u++)
80         {
81             for(int i=0;i<G[u].size();i++)
82             {
83                 int v=G[u][i];
84                 if(sccno[u]!=sccno[v])   in[sccno[v]]=out[sccno[u]]=0;
85             }
86         }
87         int a=0,b=0;
88         for(int i=1;i<=scc_cnt;i++)
89         {
90             if(in[i])  a++;
91             if(out[i]) b++;
92         }
93         int ans=max(a,b);
94         if(scc_cnt==1)  a=1,ans=0;
95         printf("%d\n%d\n",a,ans);
96     }
97     return 0;
98 }
时间: 2024-08-09 00:09:42

POJ 1236 Network of School的相关文章

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(强连通 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 Network of Schools (Tarjan)

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

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

[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(连通图入度,出度为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

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

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

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缩点)

题目链接:http://poj.org/problem?id=1236 题意:给出n个学校和一些学校之间的网络链接关系,学校之间的网络是单向边,让你求出两个问题的答案,1.至少需要多少份软件,使得所有学校都可以收到.2.如果希望用一份软件就能够使所有学校收到需要添加几条边 题解:首先求强连通分量然后缩点,所谓缩点就是将一个连通图化为一个点.然后再以联通图构成一个图. 然后这题的问题1只要求联通分量入度为0的点的和就行了,问题2就是求连通分量入度和出度为0的和的最 大值.(为了构成全连通分量构成的