367. 学校网络(Tarjan强连通分量)[通俗易懂]

367. 学校网络(Tarjan强连通分量)[通俗易懂]一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 A 支援学校 B,并不表示学校 B 一定要支援学校 A)。当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。因此,一个新软件若想让所有学校都能使用,只需将其提供给一些学校即可。现在请问最少需要将一个新软件直接提供给多少个学校,才能使软件能够通过网络被传送到所有学校?最少需要添加几条新的支援关系,使得将一个新软件提供给任何一个学校,其他所有学校就都可

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 A 支援学校 B,并不表示学校 B 一定要支援学校 A)。

当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。

因此,一个新软件若想让所有学校都能使用,只需将其提供给一些学校即可。

现在请问最少需要将一个新软件直接提供给多少个学校,才能使软件能够通过网络被传送到所有学校?

最少需要添加几条新的支援关系,使得将一个新软件提供给任何一个学校,其他所有学校就都可以通过网络获得该软件?

输入格式
第 1 行包含整数 N,表示学校数量。

第 2…N+1 行,每行包含一个或多个整数,第 i+1 行表示学校 i 应该支援的学校名单,每行最后都有一个 0 表示名单结束(只有一个 0 即表示该学校没有需要支援的学校)。

输出格式
输出两个问题的结果,每个结果占一行。

数据范围
2≤N≤100

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

题解
Tarjan算法求强连通分量。对每个强连通分量缩点,然后整个图是一个拓扑图

#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
const int M = N * N;
struct Edge{ 

int v,next;
}edge[M];
int head[N],cnt;
void add(int u,int v){ 

edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
int num[N],low[N],dfn;
int scc[N],sccno;
int sta[N],top,in_sta[N];
int in[N],out[N];
int n,m;
void Tarjan(int u){ 

low[u] = num[u] = ++ dfn;
sta[top ++] = u,in_sta[u] = true;
for(int i = head[u];~i;i = edge[i].next){ 

int v = edge[i].v;
if(!num[v]){ 

Tarjan(v);
low[u] = min(low[v],low[u]);
}else if(in_sta[v]){ 

low[u] = min(low[u],num[v]);
}
}
if(num[u] == low[u]){ 

sccno ++;
while(1){ 

int t = sta[-- top];
in_sta[t] = false;
scc[t] = sccno;
if(t == u)break;
}
}
}
int main(){ 

memset(head,-1,sizeof head);
cin>>n;
int x;
for(int i = 0;i < n;i ++){ 

while(cin>>x,x){ 

add(i + 1,x);
}
}
for(int i = 1;i <= n;i ++){ 

if(!num[i])Tarjan(i);
}
for(int i = 1;i <= n;i ++){ 

for(int j = head[i];~j;j = edge[j].next){ 

int v = edge[j].v;
int a = scc[i],b = scc[v];
if(a != b){ 

in[b] ++,out[a] ++;
}
}
}
int c_in = 0,c_out = 0;
for(int i = 1;i <= sccno;i ++){ 

if(!in[i])c_in ++;
if(!out[i])c_out ++;
}
cout<<c_in<<endl;
if(sccno == 1)cout<<0<<endl;
else cout<<max(c_in,c_out)<<endl;
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168618.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 二代身份证号码验证器[超简单]

    二代身份证号码验证器[超简单]一代身份证号码是十五位,2013年1月1日开始,咱们中国全面停止使用一代身份证了。二代身份证号码:1-6位:表示行政区划的代码。 1、2位,所在省(直辖市,自治区)代码; 3、4位,所在地级市(自治州)代码; 5、6位,所在区(县,自治县,县级市)的代码; 7-14位:表示出生年、月、日 15-16位:所在地派出所代码 17位:性别。奇数(1、3、5、7、9)男性,偶数(2、4、6、8、0)女性 18位:校验位,存在十一个值:0,1,2,3,4,5,6,7,8,9,X,..

  • shell expect使用方法「建议收藏」

    shell expect使用方法「建议收藏」Expect的作者DonLibes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect[isa]softwaresuiteforautomatinginteractivetools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说

  • java中jbpm工作流_node 工作流引擎

    java中jbpm工作流_node 工作流引擎1.      JBPM工作流引擎是用来做什么的首先要说明的一点是工作流引擎指的并不只是JBPM,JBPM只是工作流引擎的一种。JBPM利用JPDL流程定义语言将现实生活中处理事务的业务流程进行抽象,形成一套业务流程规则,只要处理该项业务就必须按照这个流程规则进行。举一个很简单的例子,就拿看医生来讲,看医生的整个流程必须是先挂号,再看病,再抓药,只要你进行看医生这个业务就必须按照这套流程进行。

  • 机器学习中【回归算法】详解

    机器学习中【回归算法】详解关注微信公众号【Microstrong】,我写过四年Android代码,了解前端、熟悉后台,现在研究方向是机器学习、深度学习!一起来学习,一起来进步,一起来交流吧!本文同步更新在我的微信公众号里,地址:https://mp.weixin.qq.com/s?__biz=MzI5NDMzMjY1MA==&amp;mid=2247483935&amp;idx=1&amp;sn=5e1c55c76…

  • mysql中update和select结合使用

    mysql中update和select结合使用

  • Java核心知识点精心整理(全是精华)「建议收藏」

    Java核心知识点精心整理(全是精华)「建议收藏」我不是针对谁,我是说其它面试题都是辣鸡

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号