标签:单刷题 支援 图篇 网络 学校 kuangbin 软件 include define
中文题单链接(部分)
英文题单链接(完整)
367. 学校网络
题目描述
一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 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
代码
// Problem: 学校网络
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/369/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// Time: 2022-07-24 10:38:25
//
// Powered by CP Editor (https://cpeditor.org)
//fw
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<climits>
#define zp ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
#define pii pair <int, int>
#define endl '\n'
#define pb push_back
#define lc u<<1
#define rc u<<1|1
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=1e2+10,M=N*N;
int h[N],e[M],ne[M],idx,n;
int low[N],dfn[N],stk[N],times,top,id[N],siz[N],din[N],dout[N];
bool in[N];
int scc_cnt;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++times;
stk[++top]=u;in[u]=true;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(!dfn[j])
{
tarjan(j);
low[u]=min(low[u],low[j]);
}
else if (in[j])low[u]=min(low[u],dfn[j]);
}
if(low[u]==dfn[u])
{
scc_cnt++;
int y;
do
{ y=stk[top--];
id[y]=scc_cnt;
in[y]=false;
siz[scc_cnt]++;
}while(u!=y);
}
}
int main()
{
memset(h,-1,sizeof h);
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
while(cin>>x,x)
{
add(i,x);
}
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
{
for(int j=h[i];~j;j=ne[j])
{
int k=e[j];
int a=id[i],b=id[k];
if(a!=b)
{
dout[a]++;
din[b]++;
}
}
}
int p=0,q=0;
for(int i=1;i<=scc_cnt;i++)
{
if(din[i]==0)p++;
if(dout[i]==0)q++;
}
cout<<p<<endl;
if(scc_cnt==1)cout<<0<<endl;
else cout<<max(p,q)<<endl;
return 0;
}
标签:单刷题,支援,图篇,网络,学校,kuangbin,软件,include,define 来源: https://www.cnblogs.com/avarice/p/16514073.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。