Network of Schools
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 16343   Accepted: 6484

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
【分析】第一问就是问最少有多少个连通块,可以用Tarjan缩点,然后看入度为0的连通分量有多少个就行了。
第二问就是问最少添加几条边使得这个无向图变成一个连通块,缩点后,令father为树根数,令son为子叶数,则答案为max(father,son),若缩点后就一个点,则输出1 0。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 10000
typedef long long ll;
using namespace std;
const int N=105;
const int M=10005;
int s,t,n,m,cnt,tim,top,cut;
int head[N],dfn[N],low[N],stack1[N];
int num[N],in[N],out[N],vis[N];
bool flag=false;
struct man
{
    int to,nxt;
}edg[M];
void addedg(int u,int v)
{
    edg[cnt].to=v;edg[cnt].nxt=head[u];head[u]=cnt++;
}
void init()
{
    cnt=0;tim=1;top=cut=0;
    memset(head,-1,sizeof head);
    memset(dfn,0,sizeof dfn);
    memset(low,0,sizeof low);
    memset(stack1,0,sizeof stack1);
    memset(num,0,sizeof num);
    memset(in,0,sizeof in);
    memset(out,0,sizeof out);
    memset(vis,0,sizeof vis);
    memset(edg,0,sizeof edg);
}
void dfs(int u) {
    int v;
    low[u] = dfn[u] = ++tim;
    stack1[top++] = u;
    vis[u] = 1;
    for(int e = head[u]; e != -1; e = edg[e].nxt)
    {
        v = edg[e].to;
        if(!dfn[v])
        {
            dfs(v);
            low[u] = min(low[u], low[v]);
        }
        else if(vis[v])
        {
            low[u] = min(low[u], dfn[v]);
        }
    }
    if(low[u] == dfn[u])
    {
        cut++;//printf("!!!%d\n",u);
        do
        {
            v = stack1[--top];
            num[v] = cut;
            vis[v] = 0;
        }while(u != v);
    }
}
int main() {
    while(~scanf("%d",&n)){
    init();
    for(int i=1;i<=n;i++){
        while(1){
            scanf("%d",&m);
            if(!m)break;
            addedg(i,m);
        }
    }
    for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
    for(int i=1;i<=n;i++){
        for(int j=head[i];j!=-1;j=edg[j].nxt){
            int v=edg[j].to;//printf("%d %d %d %d\n",i,num[i],v,num[v]);
            if(num[i]!=num[v])out[num[i]]++,in[num[v]]++;
        }
    }
    int father=0,son=0;
    for(int i=1;i<=cut;i++){
        if(in[i]==0)father++;
        if(out[i]==0)son++;
    }
    if(cut==1)printf("1\n0\n");
    else printf("%d\n%d\n",father,max(father,son));
    }
    return 0;
}

POJ1236 Network of Schools (强连通)(缩点)的更多相关文章

  1. POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度

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

  2. poj-1236.network of schools(强连通分量 + 图的入度出度)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27121   Accepted: 10 ...

  3. POJ1236 Network of Schools (强连通分量,注意边界)

    A number of schools are connected to a computer network. Agreements have been developed among those ...

  4. [poj1236]Network of Schools(targin缩点SCC)

    题意:有N个学校,从每个学校都能从一个单向网络到另外一个学校.1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次 ...

  5. poj1236 Network of Schools(SCC缩点+结论推导)

    第一问简单不讲. 第二问简化后问题是给一张DAG求最少添加几条边使得DAG变成一个SCC.首先所有中间点(有入度有出度)肯定直接顺着走到无出度点,所以肯定是无出度点连向无入度点. 把无入度点作为点集S ...

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

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

  7. POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)

    Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...

  8. Network of Schools(强连通分量+缩点) (问添加几个点最少点是所有点连接+添加最少边使图强连通)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13801   Accepted: 55 ...

  9. POJ 1236 Network of Schools Tarjan缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22729   Accepted: 89 ...

随机推荐

  1. Enumeration 接口

    Enumeration是遍历集合元素的一种方法. Enumeration中只有两个方法: 1.hasMoreElements()  测试此枚举是否包含更多的元素. 2.nextElement()  如 ...

  2. 【转发】linux文件系统变为只读的修复

    详细解决方法:http://smartmontools.sourceforge.net/badblockhowto.html 相关问题,更换硬盘:http://blog.chinaunix.net/u ...

  3. SharePoint 2013 Nintex Workflow 工作流帮助(二)

    博客地址 http://blog.csdn.net/foxdave 工作流动作 1. Action Set(Logic and flow分组) 它是一个工作流的集合,可以理解为容器的东西.所以它本身并 ...

  4. Spark的编译

    由于Spark的运行环境的多样性,如可以运行在hadoop的yarn上,这样就必须要对Spark的源码进行编译.下面介绍一下Spark源码编译的详细步骤: 1.Spark的编译方式:编译的方式可以参考 ...

  5. fragment的一些bug

    自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是 Fragment带来的一些优点,比如说:Fragment可以使你能够将 ...

  6. 重拾java系列一java基础(1)

    前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...

  7. org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors

    最近在项目中发现如下异常: 六月 25, 2015 5:58:34 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet ...

  8. Day1 summary

    对比了几篇在hadoop环境中实现关联规则.频繁项集的论文,文章结构都涉及mapreduce模型.传统与改进apriori算法比较.实验结果分析(数据规模-用时or加速比,节点-用时or加速比).有一 ...

  9. PHP流程控制分支结构

    1.顺序结构2.分支结构(条件结构.选择结构)    (1)单路分支        //条件bool,ture或false        if(条件){            执行语句:       ...

  10. HTML的定位属性

    position    用于定义一个元素是否absolute(绝对),relative(相对),static(静态),或者fixed(固定) top层距离顶点纵坐标的距离 left层距离顶点横坐标的距 ...