题目链接:http://poj.org/problem?id=1236

题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。
问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。
问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

解题思路:首先用tarjan求得所有强联通分量,将每个强联通分量看成一个点,这样会得到一个有向无环图DAG, 那么对于问题一只需要要找出DAG图上有多少个入度为0的点,对于问题二需要在DAG图上找出度为0的点的个数, 然后与问题一入度为0的点的个数取最大值, 就是问题二的答案。

需要注意的是只有一个强联通分量的时候, 需要特判一下。

代码如下:

#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = ; vector<int>vec[N], stk;
bool mp[N][N], in_stk[N];
int low[N], dfn[N], tot, cou_scc;
int belong[N];
int n; void tarjan(int u, int f)
{
dfn[u] = low[u] = tot ++;
stk.push_back(u), in_stk[u] = true;
for(int i=; i < vec[u].size(); ++ i)
{
int v = vec[u][i];
if(dfn[v] == -)
{
tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(in_stk[v])
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u])
{
++ cou_scc;
while()
{
int v = stk.back();
stk.pop_back();
in_stk[v] = false;
belong[v] = cou_scc;
if(u == v)
break;
}
}
} int main()
{
while(scanf("%d", &n) != EOF)
{
memset(mp, false, sizeof(mp));
for(int i=; i<=n; ++ i)
{
vec[i].clear();
int c;
while(scanf("%d", &c), c)
{
vec[i].push_back(c);
mp[i][c] = true;
}
}
memset(low, -, sizeof(low));
memset(dfn, -, sizeof(dfn));
memset(belong, -, sizeof(belong));
memset(in_stk, false, sizeof(in_stk));
cou_scc = , tot = ;
stk.clear();
for(int i=; i<=n; ++ i)
{
if(dfn[i] == -)
tarjan(i, -);
}
int in[N], out[N];
memset(in, , sizeof(in));
memset(out, , sizeof(out));
for(int i=; i<=n; ++ i)
{
for(int j=; j<=n; ++ j)
{
if(mp[i][j] && belong[i] != belong[j])
{
++ in[belong[j]];
++ out[belong[i]];
}
}
}
if(cou_scc == )
{
printf("1\n0\n");
continue;
}
int x = , y = ;
for(int i=; i<=cou_scc; ++ i)
{
if(in[i] == )
++ x;
if(out[i] == )
++ y;
}
printf("%d\n%d\n", x, max(x, y));
}
}

POJ 1236-Network of Schools (图论-有向图强联通tarjan)的更多相关文章

  1. POJ 1236 Network of Schools (有向图的强连通分量)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9073   Accepted: 359 ...

  2. POJ - 1236 Network of Schools(有向图的强连通分量)

    d.各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输, 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 问题2:至少需要添加几条传输线 ...

  3. POJ 3180-The Cow Prom (图论-有向图强联通tarjan算法)

    题目大意:有n个牛在一块, m条单项绳子, 有m个链接关系, 问有多少个团体内部任意两头牛可以相互可达 解题思路:有向图强连通分量模版图 代码如下: #include<stdio.h> # ...

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

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

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

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

  6. Poj 1236 Network of Schools (Tarjan)

    题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...

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

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

  8. poj 1236 Network of Schools(连通图入度,出度为0)

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

  9. [tarjan] poj 1236 Network of Schools

    主题链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K To ...

随机推荐

  1. mysql系统库INFORMATION_SCHEMA,MySQL,TEST,mysql系统表的作用

    本文简要说明了MySQL数据库安装好后自带的INFORMATION_SCHEMA,MySQL,TEST三个数据库的用途. 第一个数据库INFORMATION_SCHEMA: 提供了访问数据库元数据的方 ...

  2. Apache Shiro系列教程之二:十分钟上手Shiro

    在本教程中,我们会写一个简单的.仅仅输出一些内容命令行程序,从而对Shiro有一个大体的感觉. 一.准备工作 本教程需要Java1.5+,并且我们用Maven生成项目,当然Maven不是必须的,你也可 ...

  3. [Eclipse] - 集成Tomcat热加载插件

    使用Eclipse + Tomcat,要使用热加载,总是会重启tomcat webapp. 可以使用这个插件:jrebel 如果是Tomcat 7.0+版本,需要使用jrebel5.5.1+的版本,不 ...

  4. android学习笔记49——SQLite2

    使用SQLite工具 位于Android SDK/tools-->sqlite3.exe,其是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口. ..... 使用特定方法操 ...

  5. Navicat(服务器对象) -2之MySQL 或 MariaDB 对象

    MySQL 或 MariaDB 对象 http://www.navicat.com.cn/manual/online_manual/cn/navicat/win_manual/index.html 要 ...

  6. math.h--------数学函数

    三角函数 1.cos 函数 --- 求x的余弦值,返回弧度x的余弦值.(弧度=角度×PI/180). 函数原型 double cos(double x); 函数参数:弧度值 用例:v = cos (x ...

  7. 如何修改SharePoint列表条数等阈值

    若要修改SharePoint中对列表最大条数等设定的阈值,可按如下步骤操作: 1. 打开页面:管理中心 > 应用程序管理 > 管理Web应用程序.2. 选择要修改阈值的Web应用程序,并在 ...

  8. Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)

    利用Mysqldump备份和迁移,我想很多人都用过,具体参数不介绍了,这里主要讲.NET调用Mysqldump进行备份和.NET调用Mysql.exe进行导入数据. 这里使用的是5.1版的Mysqld ...

  9. 为什么C++中空类和空结构体大小为1?(转载)

    原文链接:http://www.spongeliu.com/260.html 对于结构体和空类大小是1这个问题,首先这是一个C++问题,在C语言下空结构体大小为0(当然这是编译器相关的).这里的空类和 ...

  10. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...