当前位置: 首页 > news >正文

洛谷—— P2812 校园网络

 P2812 校园网络

题目背景

浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件。但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们。

题目描述

共有n所学校(n<=10000)已知他们实现设计好的网络共m条线路,为了保证高速,网络是单向的。现在请你告诉他们至少选几所学校作为共享软件的母机母鸡,能使每所学校都可以用上。再告诉他们至少要添加几条线路能使任意一所学校作为母机母鸡都可以使别的学校使用上软件。

输入输出格式

输入格式:

 

第一行一个整数n。

接下来n行每行有若干个整数,用空格空格隔开。

第i-1行的非零整数x,表示从i到x有一条线路。以0作为结束标志。

 

输出格式:

 

第一行一个整数表示问题1的答案。

第二行回答问题2.

 

输入输出样例

输入样例#1:
5
2 0
4 0
5 0
1 0
0
输出样例#1:
2
2

说明

POJ原题。数据扩大了100倍。

 

tarjan求强连通分量水题

求出强连通分量以后,我们知道入度为零的点就是无信息来源的点。

强连通分量满足该强连通分量中无入度为零的点以及出度为零的点,那么我们要添加的边的条数就是max(入度为零的点的个数,出度为零的点的个数)

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100000
using namespace std;
bool vis[N];
int n,x,top,tim,tot,sum,ans,ans1,ans2;
int in[N],out[N],dfn[N],low[N],head[N],stack[N],belong[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
struct Edge
{
    int from,to,next;
}edge[N];
int add(int x,int y)
{
    tot++;
    edge[tot].to=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int tarjan(int now)
{
    dfn[now]=low[now]=++tim;
    stack[++top]=now;vis[now]=true;
    for(int i=head[now];i;i=edge[i].next)
    {
        int t=edge[i].to;
        if(vis[t]) low[now]=min(low[now],dfn[t]);
        else if(!dfn[t]) tarjan(t),low[now]=min(low[now],low[t]);
    }
    if(low[now]==dfn[now])
    {
        sum++,belong[now]=sum;
        for(;stack[top]!=now;top--)
        {
            int t=stack[top];
            belong[t]=sum,vis[t]=false;
        }
        vis[now]=false; top--;
    }
}
int shink_point()
{
    for(int i=1;i<=n;i++)
     for(int j=head[i];j;j=edge[j].next)
     {
         int t=edge[j].to;
         if(belong[i]!=belong[t]) 
          in[belong[t]]++,out[belong[i]]++;
     }
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        while(1)
        {
            x=read();
            if(x==0) break;
            add(i,x);
        }
    }  
    for(int i=1;i<=n;i++)
     if(!dfn[i]) tarjan(i);
    shink_point();
    for(int i=1;i<=sum;i++)
    {
        if(in[i]==0) ans1++;
        if(out[i]==0) ans2++;
     } 
    ans=max(ans1,ans2);
    printf("%d\n%d\n",ans1,ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/7461616.html

相关文章:

  • 客观看待社保系统管理漏洞
  • ssh 免密码登录
  • 积极推动中国金融资产市场化流动
  • 互联网时代 数据中心如何满足未来需求
  • 吴晓军:加强保险业大数据能力的建设
  • 向亲戚朋友解释系列之什么是IP,端口和域名
  • IDF2013:大数据带来医疗行业转折点
  • python实例pyspark以及python中文显示
  • Linux下sh文件运行及桌面环境双击运行sh文件
  • 3.jeesite主从表开发
  • java特训第四课(转)
  • 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)
  • 浅谈微博与贴吧!
  • 《中国人工智能学会通讯》——1.44 到底什么是虹膜识别
  • 《中国人工智能学会通讯》——2.15 手术机器人
  • [NodeJS] 关于Buffer
  • css属性的继承、初识值、计算值、当前值、应用值
  • js操作时间(持续更新)
  • PV统计优化设计
  • sublime配置文件
  • uva 10370 Above Average
  • vue-router 实现分析
  • 当SetTimeout遇到了字符串
  • 番外篇1:在Windows环境下安装JDK
  • 删除表内多余的重复数据
  • elasticsearch-head插件安装
  • ​linux启动进程的方式
  • #DBA杂记1
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (10)ATF MMU转换表
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (c语言)strcpy函数用法
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (层次遍历)104. 二叉树的最大深度
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (九)信息融合方式简介
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (五)关系数据库标准语言SQL
  • (转)程序员疫苗:代码注入
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)人的集合论——移山之道
  • .bat批处理(一):@echo off
  • .NET NPOI导出Excel详解
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET分布式缓存Memcached从入门到实战
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • :“Failed to access IIS metabase”解决方法
  • @EnableWebMvc介绍和使用详细demo
  • @Query中countQuery的介绍
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Android]使用Git将项目提交到GitHub