OJ 1234 校园网络

     
 
From easthong

校园网络

 
     
     
  描述 Description  
  一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意如果 B 在 A 学校的分发列表中,那么 A 不必也在 B 学校的列表中。

你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务
A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务
B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。

     
     
  输入格式 Input
Format
 
  第一行包括一个整数 N:网络中的学校数目(2 <= N <=
100)。学校用前 N 个正整数标识。接下来 N 行中每行都表示一个接收学校列表(分发列表)。第 i+1 行包括学校 i 的接收学校的标识符。每个列表用 0
结束。空列表只用一个 0 表示。
     
     
  输出格式 Output
Format
 
  第一行应该包括一个正整数:子任务 A 的解。第二行应该包括子任务 B
的解。
     
     
  样例输入 Sample
Input
 
  5
2 4 3 0
4 5 0
0
0
1 0
     
     
  样例输出 Sample Output  
  1
2
     
     
  时间限制 Time Limitation  
  1s
     
     
  注释 Hint  
   
     
     
  来源 Source  
  usaco 5.3.3

这道题有两问

第一问很简单,先tarjin缩一下点,然后找出所有入度为0的点,那么这些点是必须要副本的,其他的点一定可以有这些点到达,所以答案就是所有入度为0的点

第二问,有一个小结论,就是一个有向图我们只需要最多连max(入度为0的点的个数,初度为0的点的个数)条边,那么个图就可以成为强连通的,即从任意一个点可以到达另外所有点,但当只有一个强连通分量的时候要输出0而不是1

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline int read(){
 5     int x=0;int f=1;char ch=getchar();
 6     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
 7     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
 8     return x*f;
 9 }
10 const int MAXN=1e4+10;
11 namespace zhangenming{
12     struct node{
13           int x,y,next;
14     }e[MAXN];
15     int linkk[MAXN],len=0,n;
16     inline void insert(int xx,int yy){
17          e[++len].y=yy;e[len].x=xx;e[len].next=linkk[xx];linkk[xx]=len;
18     }
19    void init(){
20        n=read();
21        for(int i=1;i<=n;i++){
22         int xx=read();
23            while(xx){
24                insert(i,xx);
25             xx=read();
26            }
27        }
28     }
29     int vis[MAXN],stark[MAXN],ine[MAXN],cntt[MAXN]={},tot=0,top=0,cnt[MAXN]={},dfn[MAXN]={},low[MAXN],dfs_clock=0;
30     inline void tarjin(int st){
31         //cout<<st<<endl;
32         dfn[st]=low[st]=++dfs_clock;vis[st]=1;
33         stark[++top]=st;
34         for(int i=linkk[st];i;i=e[i].next){
35             if(!dfn[e[i].y]){
36                 //cout<<e[i].y<<endl;
37                 tarjin(e[i].y);
38                 low[st]=min(low[st],low[e[i].y]);
39             }
40             else if(vis[e[i].y]) low[st]=min(low[st],dfn[e[i].y]);
41         }
42         if(low[st]==dfn[st]){
43             tot++;
44             int k;
45             do{
46                 k=stark[top--];
47                 ine[k]=tot;
48                 vis[k]=0;
49             }while(k!=st);
50         }
51     }
52     void solve(){
53         memset(vis,0,sizeof(vis));
54         for(int i=1;i<=n;i++){
55             if(!ine[i]) tarjin(i);
56         }
57         for(int i=1;i<=len;i++){
58             int xx=e[i].x;int yy=e[i].y;
59             if(ine[xx]==ine[yy]) continue;
60             cnt[ine[yy]]++;
61             cntt[ine[xx]]++;
62         }
63         int sum1=0;int sum2=0;
64         for(int i=1;i<=tot;i++){
65             if(!cnt[i]) sum1++;
66             if(!cntt[i]) sum2++;
67         }
68         cout<<sum1<<endl;
69         if(tot!=1) cout<<max(sum1,sum2)<<endl;
70         else cout<<0<<endl;
71     }
72 }
73 int main(){
74     using namespace zhangenming;
75     init();
76     solve();
77     return 0;
78 }

代码

时间: 2024-10-10 23:06:52

OJ 1234 校园网络的相关文章

[2016-04-21][light]OJ[1234][Harmonic Number]

时间:2016-04-21 22:18:26 星期四 题目编号:[2016-04-21][light]OJ[1234][Harmonic Number] 题目大意:求∑nk=11kn∈(1,108),精确到10?8求∑k=1n1kn∈(1,108),精确到10?8 分析: 想法是打表,然后输出,但是直接打表会爆内存 解决办法,就是每隔100个来打表,节省1100的空间,然后从那个值开始计算到当前值解决办法,就是每隔100个来打表,节省1100的空间,然后从那个值开始计算到当前值 对应的整百就是n

校园网络(模拟)

校园网络 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南阳理工学院共有M个系,分别编号1~M,其中各个系之间达成有一定的协议,如果某系有新软件可用时,该系将允许一些其它的系复制并使用该软件.但该允许关系是单向的,即:A系允许B系使用A的软件时,B未必一定允许A使用B的软件. 现在,请你写一个程序,根据各个系之间达成的协议情况,计算出最少需要添加多少个两系之间的这种允许关系,才能使任何一个系有软件使用的时候,其它所有系也都有软件可用. 输入 第一行输入一个整数T,

NYOJ 120 校园网络

校园网络 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南阳理工学院共有M个系,分别编号1~M,其中各个系之间达成有一定的协议,如果某系有新软件可用时,该系将允许一些其它的系复制并使用该软件.但该允许关系是单向的,即:A系允许B系使用A的软件时,B未必一定允许A使用B的软件. 现在,请你写一个程序,根据各个系之间达成的协议情况,计算出最少需要添加多少个两系之间的这种允许关系,才能使任何一个系有软件使用的时候,其它所有系也都有软件可用. 输入 第一行输入一个整数T,

Light OJ 1234 Harmonic Number 调和级数部分和

题目来源:Light OJ 1234  Harmonic Number 题意: 思路:没思路啊 这个是高数的东西 发散 n足够大时它无穷大 直接公式解 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> #include <iostream> using namespace std; const int

校园网络TV云平台

一.校园网络TV云平台 "校园网络TV云平台"是深圳矽伟智(sewise)基于"流媒体云技术"面向高校推出的一套'视频校园'网络TV门户网站资源共享平台应用方案,把高校原有的一些视频教学资源.教育行业网络电台音视频文件信息与流媒体软件服务器进行二次开发和全新的规划,通过后期的整合,以视频校园全媒体网络平台统一推送到在校学生的手机.PC.PAD.TV等端口.在校园网络公开课程板块中,老师可以录播网络课程进行在线直播和点播.学生可以自由选择和学习自己喜欢的线上课程.在校

NYOJ-120 校园网络 &amp;&amp;POJ 1236 (强连通缩点targan算法)

链接:click here 题意: 校园网络 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南阳理工学院共有M个系,分别编号1~M,其中各个系之间达成有一定的协议,如果某系有新软件可用时,该系将允许一些其它的系复制并使用该软件.但该允许关系是单向的,即:A系允许B系使用A的软件时,B未必一定允许A使用B的软件. 现在,请你写一个程序,根据各个系之间达成的协议情况,计算出最少需要添加多少个两系之间的这种允许关系,才能使任何一个系有软件使用的时候,其它所有系也都有软件

某中学校园网络建设过程中虚拟化的实施(一)

前两天我刚完成了XX中学的校园网改造项目,改造前的学校网络中心机房内部破乱不堪,静电地板脱皮破损严重,UPS使用5年以上已经电量不足,机柜老化,核心交换机S5750满足不了日益增加的业务量,所使用的服务器都是老式的台式电脑,出口网关使用的是软路由,校园内部的终端接入是百兆. 这次校园网改造涉及到数据机房建设.智分+无线系统.多功能出口网关.VPN.服务器虚拟化.VDP.P2V.云教室等技术.我们首先对机房进行扩容增大机房面积,对机房进行重新装修,增加防静电防尘,接地防雷,增加一套UPS系统.更换

校园网络电视台直播搭建方案

客户的需求: 我们是想建立校园电视台.有四路信号,两个摄像机,一个电视信号从机顶盒出来,还有就是笔记本HDMI输出,进行多机位切换画面后只一路输出到流媒体系统.观看端主要是PC和手机微信里进行观看. 并发不大前期大概100左右.需要录制每次2个小时左右. 客户关注点: 1.       流媒体直播系统是否支持Linux平台安装. 2.       是否有P2P功能,可以节省带宽. 3.       是否是Flash 技术,观看者可以无需安装插件. 4.       是否能嵌入手机微信进行观看.

Light oj 1234 - Harmonic Number

题目链接:http://lightoj.com/volume_showproblem.php?problem=1234 给你一个数n,让你求 这个要是直接算的话肯定TLE,要是用1e8的数组预处理存储答案也一定MLE. 所以我用1e6的数组存储每100个数的答案,然后每次给你n的时候顶多算99次. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5