POJ1236:Network of Schools (思维+Tarjan缩点)
Network of Schools
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 24880 | Accepted: 9900 |
题目链接:http://poj.org/problem?id=1236
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
题意:
给出一个有向图,然后要你输出两个任务的答案:
1.至少需要从多少个点出发,能够到达所有的点;2.最少需要连多少条边,能够使得从任意点出发都能够到达其它所有点。
题解:
这个题我一开始想的就是直接暴力,但很明显第二个问题行不通,所以就要考虑一些性质,或者用一些数学思想。
第一个问题还是比较好想,入度为0的点的个数即位答案,如果不存在入度为0的点,答案就是1。简略证明如下(题目保证图是连通的):
假设入度为0的点为n,那么至少需要n个点才能遍及所有点,然后对于其余入度非0的点来说,必然是由其他点到达的,如果这个点不在环上,那么就必定是从一个入度为0的点来的;如果这个点在环上,这个环中的所有点也会由其余入度为0的点到达;假设这是个单独的环,那么答案为1。
第二个问题要求所有点都互相可以到达。那么我们可以知道的是,图中必然不会存在入度为0以及出度为0的点,假设这两者的个数分别为n,m。
那么最优的连边方法就是入度为0的点与出度为0的点匹配,最后剩下的乱连就行了,所以最后答案就是max(n,m)。证明的话yy一下吧。
因为我们刚才是基于有向无环图来思考的,环的存在应该把它当作一个点,所以考虑Tarjan缩波点就行了。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
const int N = ;
int n,tot;
int head[N],in[N],out[N],low[N],dfn[N],vis[N],scc[N];
struct Edge{
int u,v,next;
}e[N*N<<],edge[N*N<<];
void adde(int u,int v){
e[tot].u=u;e[tot].v=v;e[tot].next=head[u];head[u]=tot++;
}
stack <int> s;
int T,num;
void Tarjan(int u){
dfn[u]=low[u]=++T;vis[u]=;
s.push(u);
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(!vis[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!scc[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
num++;int now;
do{
now = s.top();s.pop();
scc[now]=num;
}while(!s.empty() && now!=u);
}
}
int main(){
scanf("%d",&n);
int m=;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++){
int v;
while(scanf("%d",&v)!=EOF){
if(v==) break ;
edge[++m].u=i;edge[m].v=v;
adde(i,v);
}
}
//cout<<m<<endl;
for(int i=;i<=n;i++){
if(!vis[i]) Tarjan(i);
}
for(int i=;i<=m;i++){
int u=edge[i].u,v=edge[i].v;
if(scc[u]!=scc[v]){
in[scc[v]]++;out[scc[u]]++;
}
}
int cnt1=,cnt2=;
for(int i=;i<=num;i++){
if(!in[i]) cnt1++;
if(!out[i]) cnt2++;
}
//cout<<num<<endl;
if(num==) cout<<<<endl<<;
else cout<<cnt1<<endl<<max(cnt2,cnt1);
return ;
}
POJ1236:Network of Schools (思维+Tarjan缩点)的更多相关文章
- POJ1236:Network of Schools(tarjan+缩点)?
题目: http://poj.org/problem?id=1236 [题意] N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输,问题1 ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
- POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度
题目链接:http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Tot ...
- P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools
P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...
- poj1236 Network of Schools【强连通分量(tarjan)缩点】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4316263.html ---by 墨染之樱花 [题目链接]http://poj.org/pr ...
- POJ1236 - Network of Schools tarjan
Network of Schools Time Limit: 1000MS Memory Limi ...
- POJ1236 Network of Schools (强连通)(缩点)
Network of Schools Time Limit: 1000MS ...
- POJ-1236 Network of Schools,人生第一道Tarjan....
Network of Schools 题意:若干个学校组成一个计算机网络系统,一个学校作为出发端连接着若干个学校,信息可以传送到这些学校.被链接的学校不需要再次与出发端相连,现在问你:A:最少选几个学 ...
随机推荐
- 使用bing或google来翻译网页
google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...
- 饥饿的小易(枚举+广度优先遍历(BFS))
题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...
- linux服务器操作小技巧
python程序后台一直运行,并将打印信息输出到文件中 nohup -u test.py > out.txt & -u 表示无缓冲,直接将打印信息输出带文件中 &表示程序后台运行
- 【机器学习】多项式回归python实现
[机器学习]多项式回归原理介绍 [机器学习]多项式回归python实现 [机器学习]多项式回归sklearn实现 使用python实现多项式回归,没有使用sklearn等机器学习框架,目的是帮助理解算 ...
- Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
自己搭建了一套伪分布的大数据环境,运行Hadoop包中自带的示例时,出现如下错误: 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMas ...
- HDU 1042 N!(高精度乘)
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in ...
- javaIO--字节流
流---是指的一组有序的.有气垫和重点的字节集合,是对的护具传输的总称或者抽象. 流采用缓冲区技术,当写一个数据时,系统将数据发送到缓冲区而不是外部设备(如硬盘),当读一个数据时,系统实际是从缓冲区读 ...
- Swift-map()跟flatMap()区别
map()方法介绍 map() 是 Array 提供的方法,通过接收一个函数作为传入参数,对数组中每个元素进行函数变换得到新的结果值.这样只需要提供 X->Y 的映射关系,就能将数组 [X ...
- Razor语法和Razor引擎大全
一.Razor语法 1.Razor的标识符 解释:@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了.web form中使用<%%>中写服务器代码一个道理.在vs工具里 ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...