题目链接

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

求: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. react新手入门(序)

    之前在软件园使用的是react,当时为了做个集光推送,自己去搭过react,这次项目中继续使用react,于是又重新操作了遍,恰巧公司买了本react的书籍,这本书写的非常好,看着并不觉得拗口,很容易 ...

  2. ssm框架搭建并演示获取json字符串

    为方便起见,使用oracle自带的scott账户中的emp表作为数据源. 预期效果: 1.输入URL:http://localhost:8888/ssm/getEmp?empno=7369 2.返回结 ...

  3. js事件总结

    事件冒泡: 什么是事件冒泡,就是最深dom节点触发事件,然后逐级向最外层触发事件.打个比方一棵dom tree:li<ul<div每级都有事件绑定,然后我们触发li的事件,这时ul上的事件 ...

  4. Eclipse导入android项目包xml报错未生成R文件

    最近很是头痛的就是项目带回家做的时候.导入各种问题.自从升级23以后. 生成的带appcompat_v7包.copy时不论是新建还是导入这个包,项目都会报错. 网上的方法试了各种clean各种fix等 ...

  5. nginx配置技巧汇总

    https://segmentfault.com/a/1190000000437323

  6. MVC 5 视图之公用代码

    一.公共模板 1.@RenderBody() 在网站公用部分通过一个占位符@RenderBody()来为网站独立部分预留一个位置.然后私有页面顶部通过@{Layout="公用模板路径&quo ...

  7. Razor------引入css文件的方法

    MVC3.0之前版本: <link href=@Url.Content("~/Content/Styles.css") rel="stylesheet" ...

  8. 工作流JBPM_day01:3-使用JBPM的API添加与执行流程

    工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...

  9. VS-Qt-OSG-CMake基本项目框架

    在VS-Qt-CMake基础上,打开mainwindow.ui,添加一个QWidget,然后在widget上右键-提升,选择SceneViewWidget CMakeLists.txt中添加了OSG相 ...

  10. 点击一个textView里的link导航至程序内可返回的自定义webView

    1,在AppDelegate.h里定义一个 id currentViewController; 在AppDelegate.m里 @implementation UIApplication (Priva ...