题目链接

题意:学校有一些单向网络,现在需要传一些文件

求:1,求最少需要向几个学校分发文件才能让每个学校都收到,

  2,需要添加几条网络才能从任意一个学校分发都可以传遍所有学校。

解题思路(参考大神的):

—        1. 求出所有强连通分量

—        2. 每个强连通分量缩成一点,则形成一个有向无环图DAG。

—        3. DAG上面有多少个入度为0的顶点,问题1的答案就是多少

在DAG上要加几条边,才能使得DAG变成强连通的,问题2的答案就是多少

加边的方法:

要为每个入度为0的点添加入边,为每个出度为0的点添加出边

假定有 n 个入度为0的点,m个出度为0的点,如何加边?

把所有入度为0的点编号 0,1,2,3,4 ....N -1

每次为一个编号为i的入度0点可达的出度0点,添加一条出边,连到编号为(i+1)%N 的那个出度0点,

这需要加n条边

若 m <= n,则

加了这n条边后,已经没有入度0点,则问题解决,一共加了n条边

若 m > n,则还有m-n个入度0点,则从这些点以外任取一点,和这些点都连上边,即可,这还需加m-n条边。

所以,max(m,n)就是第二个问题的解

此外:当只有一个强连通分支的时候,就是缩点后只有一个点,虽然入度出度为0的都有一个,但是实际上不需要增加清单的项了,所以答案是1,0;

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <stack>
using namespace std;
#define INF 0xfffffff
#define N 10060
int Out[N],In[N], n; int low[N], dfn[N], num, cnt, Time, vis[N], belong[N];
vector<int> G[N];
stack<int>sta; void Init()
{
Time=num=cnt=;
for(int i=;i<=n;i++)
G[i].clear();
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(vis, , sizeof(vis));
memset(belong, , sizeof(belong));
memset(Out, , sizeof(Out));
memset(In, , sizeof(In));
} void Tarjan(int u)
{
dfn[u] = low[u] = ++Time;
int len = G[u].size(), v;
sta.push(u);
vis[u] = ;
for(int i=; i<len; i++)
{
v = G[u][i];
if(dfn[v]==)
{
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v]==)
{
low[u] = min(dfn[v], low[u]);
}
}
if(low[u]==dfn[u])
{
++num;
do
{
v = sta.top();
belong[v] = num;// 缩点;
sta.pop();
vis[v] = ;
}while(u!=v);
}
}
int main()
{
int a, ans1, ans2, ans, u, v;
while(scanf("%d", &n)!=EOF)
{
Init(); for(int i=; i<=n; i++)
{
while(scanf("%d", &a), a)
{
G[i].push_back(a);
}
}
for(int i=; i<=n; i++)
if(!dfn[i])
Tarjan(i);
ans1 = ans2 = ;
for(int i=; i<=n; i++)
{
int len=G[i].size();
for(int j=; j<len; j++)
{
u = belong[i]; v = belong[G[i][j]];
if(u!=v)
{
Out[u]++;
In[v]++;
}
}
}
for(int i=; i<=num; i++)
{
if(Out[i]==)ans2++;
if(In[i]==)ans1++;
}
ans = max(ans1, ans2);
if(num==)
printf("1\n0\n");
else
printf("%d\n%d\n", ans1, ans);
}
return ;
}

Network of Schools---poj1236(强连通分量)的更多相关文章

  1. poj1236 Network of Schools【强连通分量(tarjan)缩点】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4316263.html  ---by 墨染之樱花 [题目链接]http://poj.org/pr ...

  2. POJ 1236 Network of Schools(强连通分量/Tarjan缩点)

    传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...

  3. POJ1236_A - Network of Schools _强连通分量::Tarjan算法

    Time Limit: 1000MS   Memory Limit: 10000K Description A number of schools are connected to a compute ...

  4. poj 1236 Network of Schools(又是强连通分量+缩点)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

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

    POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...

  6. poj 1236 Network of Schools (强连通分量+缩点)

    题目大概: 每个学校都可以把软件复制好,交给它名单上的学校. 问题A:把软件复制成几份,然后交给不同的学校,所有学校才能够都有软件. 问题B:添加几条边,能使得这个图变成强连通图. 思路: 找出所有的 ...

  7. POJ 1236 Network of Schools 有向图强连通分量

    参考这篇博客: http://blog.csdn.net/ascii991/article/details/7466278 #include <stdio.h> #include < ...

  8. P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools

    P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...

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

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  10. POJ1236 Network of Schools (强连通)(缩点)

                                                                Network of Schools Time Limit: 1000MS   ...

随机推荐

  1. 利用kseq.h parse fasta/fastq 文件

    在分析中经常需要统计fasta/fastq文件的序列数和碱基数, 但是没有找到一些专门做这件事的小工具,可能是这个功能太简单了: 之前用自己写的perl的脚本统计这些信息, 当fastq文件非常大时, ...

  2. Gray Code - 格雷码

    基本概念 格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的 ...

  3. CentOS服务器上搭建Gitlab安装步骤、中文汉化详细步骤、日常管理以及异常故障排查

    一, 服务器快速搭建gitlab方法 可以参考gitlab中文社区 的教程centos7安装gitlab:https://www.gitlab.cc/downloads/#centos7centos6 ...

  4. Oracle查询优化--排序

    --普通排序 SELECT * FROM emp ORDER BY sal DESC; --使用列序排序 DESC; --组合排序 DESC; --translate函数,参数分别用A.B.C表示 S ...

  5. tomcat server.xml docbase workdir

    在tomcat安装好后,只要把你的web项目copy到%TOMCAT_HOME%webapp下面就可以是使用啦!!其实还有种方法就是设定虚拟目录,即把项目的目录映射到tomcat中.这样做即可以不用重 ...

  6. ASIHttpRequest封装

    ASIHttpRequest是一个非常好的库,只是直接使用稍嫌麻烦,以下就尝试来封装一下吧. 思路:每次请求时,须要创建一个ASIHttpRequest对象,设置它的属性(url,delegate.p ...

  7. SVN常用命令与分支操作

    1.基本操作 1.0 创建版本库: Svnadmin create /data/repos 2.0 修改配置文件 Auth文件   [groups]   admin=shguo   [/]   @ad ...

  8. laravel Eloquent 模型(也就是我本时说的Model)

    laravel的 Eloquent 模型其实就是我们平时说的MVC里Model,只是换了个名字而已~ 1)Eloquent 是啥? Eloquent 本质就一个查询构建器(laravel里叫查询构建器 ...

  9. docker学习-docker镜像

    docker就是一系列文件,

  10. 多线程模块:threading

    threading 常见用法: (1) 在 thread 中,我们是通过 thread.start_new_thread(function, args) 来开启一个线程,接收一个函数和该函数的参数,函 ...