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

题意:给定一个表示n所学校网络连通关系的有向图。现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u接收到。

现要求解两个问题:

TaskA: 最少分发给几个学校,就可以使所有的学校都能得到软件。

TaskB: 最少增加几条边,就可以使得,发软件给任一学校,所有学校都可以收到。

思路:先进行强联通分量分解,然后缩点,并计算缩点后每个点的出度、入度。入度为0的点的总数为 a ,出度为0的点总数为 b。a即TaskA的答案,而TaskB的答案为max(a, b)。

求SCC部分参考了 http://blog.csdn.net/dgq8211/article/details/7834292

缩点的做法很暴力,将每个强联通分量重新编号为一个集合,在求SCC时记录belong。

 #include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
const int MAX_N = ; int n;
vector<int> G[MAX_N];
stack<int> S;
int clock;
int scc;
int dfn[MAX_N], low[MAX_N];
int inStack[MAX_N];
int belong[MAX_N];
int indeg[MAX_N];//scc的
int outdeg[MAX_N]; void init(){
scc = ;
clock = ;
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(inStack, , sizeof(inStack));
memset(indeg, , sizeof(indeg));
memset(outdeg, , sizeof(outdeg));
} void tarjan(int u){
dfn[u] = low[u] = ++clock;
S.push(u);
inStack[u] = ;
for(int i=; i<G[u].size(); i++){
int v = G[u][i];
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}else if(inStack[v]){
low[u] = min(low[u], dfn[v]);
}
}
if(dfn[u] == low[u]){
int v;
do{
v = S.top();
S.pop();
inStack[v] = ;
belong[v] = scc;
//printf("%d ", v);
}while(v != u);
scc++;
}
} int main()
{
freopen("1236.txt", "r", stdin);
scanf("%d", &n);
for(int i=; i<=n; i++){
int u;
while(scanf("%d", &u) && u){
G[i].push_back(u);
//outdeg[i]++;
//indeg[u]++;
}
}
init();
for(int i=; i<=n; i++){//遍历所有点
if(!dfn[i]){//未被发现的点
tarjan(i);
}
}
int a = ;
int b = ; for(int i=; i<=n; i++){//缩点
for(int j=; j<G[i].size(); j++){
int u = G[i][j];
if(belong[i] != belong[u]){
outdeg[belong[i]]++;
indeg[belong[u]]++;
}
}
} for(int i=; i<scc; i++){
if(indeg[i] == ) a++;
if(outdeg[i] == ) b++;
} b = max(a, b);
if(scc == ) b = ;
printf("%d\n%d\n", a, b);
return ;
}

【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点的更多相关文章

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

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

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

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

  3. 强联通分量(tarjan算法+算法简介)

    题目描述 ›对于一个有向图顶点的子集S,如果在S内任取两个顶点u和v,都能找到一条从u到v的路径,那么就称S是强连通的.如果在强连通的顶点集合S中加入其他任意顶点集合后,它都不再是强连通的,那么就称S ...

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

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

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

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

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

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

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

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

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

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

  9. Poj 1236 Network of Schools (Tarjan)

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

随机推荐

  1. 【HDU1879】继续畅通工程(MST基础题)

    真心大水题...不多说. #include <iostream> #include <cstring> #include <cstdlib> #include &l ...

  2. ListView之ArrayAdapter

    ArrayAdapter 普通的显示listView子项,安卓的内置对象 使用方法: /* ListView :列表 通常有两个职责: a.将数据填充到布局 b.处理点击事件 一个ListView创建 ...

  3. 2D和3D空间中计算两点之间的距离

    自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...

  4. Android硬件抽象层(HAL)概要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来 ...

  5. configure交叉编译

    今天在交叉编译时犯了一个错误,纠结了好久,曾经交叉编译器的前缀基本上都是用arm-linux-,这次换了一个新环境是arm-none-linux-gnueabi-,于是想当然的把configure中的 ...

  6. 利用boost获取时间并格式化

    利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD #include <boost/date_time/gregorian/gregorian.hpp& ...

  7. Android应用切换皮肤功能实现

    原文地址:http://www.eoeandroid.com/thread-318159-1-1.html 现在大多数android应用都支持切换皮肤的功能.比如千千静听,墨迹天气等等.本文介绍两种切 ...

  8. Dreamwaver 使用root用户连接不上远程服务器

    我用dreamweaver连接远程服务,开始用的是root用户登录的,但是连接不上.网上查了一下,解决教程非常复杂,我就不列出来了. 后来我想了一下,之前我有连接过.我感觉可能是用户的问题,于是我在远 ...

  9. ActiveMQ持久化消息(转)

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  10. poj3159 Candies(差分约束)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Candies Time Limit: 1500MS   Memory Limit ...