Network of Schools
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 22745   Accepted: 8929

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 注意:
代码有误,谨慎观看(仍可AC) 思路:
求最大强连通分量,缩点。算出出度为0和入度为0的点的个数。ans1就是入度为0的点的个数,因为他们不能从其他点获取,而其他的点一定可以从其他点获取。
ans2就是入度为0的点和出度为0的点的个数的最大值,因为你需要把所有的点都弄得有入度和出度。
代码
如果我的推理没有错的话,我的代码应该是错的,只是我强行水过去了。因为正常情况下,除非只有一个强连通分量,ans1不会为0,而我测数据测出来0,所有我强行改得符合数据(就是那个max),没想到居然过了
这一切的根源,都是我的Tarjan模板有问题,而HDU竟然让我用那个模板过了一题,看来我要重学Tarjan了。
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
vector<int>u[];
int num[],low[];
bool book[];
int index;
int in[],out[];
bool flag[];
void Tarjan_dfs(int t)
{
index++;
low[t]=num[t]=index;
book[t]=true;
int siz=u[t].size();
for(int i=;i<siz;i++){
if(!book[u[t][i]]){
Tarjan_dfs(u[t][i]);
}
if(!flag[u[t][i]]){low[t]=min(low[t],low[u[t][i]]);}
}
} int main()
{
int n,x;
scanf("%d",&n);
for(int i=;i<=n;i++){
while(true){
scanf("%d",&x);
if(x==){break;}
u[i].push_back(x);
}
}
for(int i=;i<=n;i++){
if(!book[i]){Tarjan_dfs(i);}
for(int i=;i<=n;i++){
if(num[i]!=){flag[i]=true;}
}
}
for(int i=;i<=n;i++){
for(int j=;j<u[i].size();j++){
if(low[i]!=low[u[i][j]]){
out[low[i]]++;
in[low[u[i][j]]]++;
}
}
}
int ans1,ans2;
ans1=ans2=;
int numv=;
for(int i=;i<=n;i++){
if(num[i]==low[i]){
numv++;
if(in[low[i]]==){ans1++;}
if(out[low[i]]==){ans2++;}
}
}
if(numv==){printf("1\n0\n");}
else printf("%d\n%d\n",max(,ans1),max(ans2,ans1));
}

POJ 1236 Network of Schools (Tarjan)的更多相关文章

  1. POJ 1236 Network of Schools(tarjan)

    Network of Schools Description A number of schools are connected to a computer network. Agreements h ...

  2. POJ 1236 Network of Schools(tarjan)题解

    题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...

  3. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

  4. poj 1236 Network of Schools(tarjan+缩点)

    Network of Schools Description A number of schools are connected to a computer network. Agreements h ...

  5. POJ 1236 Network of Schools(tarjan求强连通分量+思维)

    题目链接:http://poj.org/problem?id=1236 题目大意: 给你一个网络(有向图),有两个任务: ①求出至少同时需要几份副本可以使得整个网络都获得副本 ②至少添加多少信息表(有 ...

  6. POJ 1236 Network of Schools(tarjan算法 + LCA)

    这个题目网上有很多答案,代码也很像,不排除我的.大家的思路应该都是taijan求出割边,然后找两个点的LCA(最近公共祖先),这两个点和LCA以及其他点构成了一个环,我们判断这个环上的割边有几条,我们 ...

  7. POJ 1236 Network of Schools (tarjan算法+缩点)

    思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...

  8. poj 1236 Network of Schools(连通图)

    题目链接:http://poj.org/problem?id=1236 题目大意:有一些学校,学校之间可以进行收发邮件,给出学校的相互关系,问:1.至少 要向这些学校发送多少份才能使所有的学校都能获得 ...

  9. POJ 1236.Network of Schools (强连通)

    首先要强连通缩点,统计新的图的各点的出度和入度. 第一问直接输出入度为0的点的个数 第二问是要是新的图变成一个强连通图,那么每一个点至少要有一条出边和一条入边,输出出度和入度为0的点数大的那一个 注意 ...

随机推荐

  1. css 引用自定义图标

    1.进入阿里图标库搜索需要的图标(搜索“图标"是全部的) 2.选择需要的图标 下载 下载svg 格式 进入https://icomoon.io/     css引用库 解压下载的压缩包 ok ...

  2. mesh函数

    [t,W]=meshgrid([2:0.2:7],[0:pi/6:3*pi]); %设置时-频相平面网格点 Gs1=(1/(sqrt(2*pi)*a))*exp(-0.5*abs((t1-t)/a). ...

  3. eclipse导入项目时,仅项目名出现红叉

    今天导入项目,项目名是红叉,百度了解决办法: 1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace- ...

  4. linux 目录分类与文件操作

    / 虚拟根目录 一般不会在这里存储文件 /bin 二进制目录,存放需要GNU用户级的工具 /boot 启动目录,存放启动文件 /dev 设备目录,linux在这里创建设备节点 /etc 系统配置文件目 ...

  5. 免费开源的会计软件 GnuCash 3.4 发布

    导读 GnuCash 3.4已经发布,GnuCash是免费和开源的会计软件.GnuCash开发团队宣布推出GnuCash 3.4,这是3.x稳定版系列的第五版. 变化 在3.3和3.4之间,完成了以下 ...

  6. 如何创建djiago项目和djiago连接数据库

    介绍 主要介绍在python中如何使用pycharm创建djiago项目以及如何将djiago项目和mysal数据库连接起来 创建djiago项目 1.使用pycharm创建djiao项目 点击pyc ...

  7. System.Diagnostics.Process启动Civil 3D及AutoCAD

    QQ群友提出问题, 如何启动Civil 3D或者AutoCAD, Kean的博客里有相关的文章 http://through-the-interface.typepad.com/through_the ...

  8. Spring Security 学习总结

    Spring Security Spring Security是基于Spring提供声明式安全保护的安全性框架.Spring Security提供了完整的安全性解决方案,能够在Web请求级别和方法调用 ...

  9. 第三方登陆——QQ登陆详解

    申请地址 QQ互联:https://connect.qq.com/index.html 腾讯开放平台:https://open.tencent.com/ 注册账号 登陆 进入QQ互联,点击登陆 资料填 ...

  10. HDU3480-Division-斜率dp

    首先想到的就是sort一下,然后每个集合都在排过序的数组里面取,不重复. 这样就推出公式dp[i][j] = min(dp[k][j-1] + (s[i]-s[k+1])^2) 其中dp[i][j]为 ...