首页 技术 正文
技术 2022年11月16日
0 收藏 972 点赞 3,524 浏览 1556 个字

题目链接:http://poj.org/problem?id=1236

题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。
问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。
问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

解题思路:首先用tarjan求得所有强联通分量,将每个强联通分量看成一个点,这样会得到一个有向无环图DAG, 那么对于问题一只需要要找出DAG图上有多少个入度为0的点,对于问题二需要在DAG图上找出度为0的点的个数, 然后与问题一入度为0的点的个数取最大值, 就是问题二的答案。

需要注意的是只有一个强联通分量的时候, 需要特判一下。

代码如下:

#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = ;vector<int>vec[N], stk;
bool mp[N][N], in_stk[N];
int low[N], dfn[N], tot, cou_scc;
int belong[N];
int n;void tarjan(int u, int f)
{
dfn[u] = low[u] = tot ++;
stk.push_back(u), in_stk[u] = true;
for(int i=; i < vec[u].size(); ++ i)
{
int v = vec[u][i];
if(dfn[v] == -)
{
tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(in_stk[v])
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u])
{
++ cou_scc;
while()
{
int v = stk.back();
stk.pop_back();
in_stk[v] = false;
belong[v] = cou_scc;
if(u == v)
break;
}
}
}int main()
{
while(scanf("%d", &n) != EOF)
{
memset(mp, false, sizeof(mp));
for(int i=; i<=n; ++ i)
{
vec[i].clear();
int c;
while(scanf("%d", &c), c)
{
vec[i].push_back(c);
mp[i][c] = true;
}
}
memset(low, -, sizeof(low));
memset(dfn, -, sizeof(dfn));
memset(belong, -, sizeof(belong));
memset(in_stk, false, sizeof(in_stk));
cou_scc = , tot = ;
stk.clear();
for(int i=; i<=n; ++ i)
{
if(dfn[i] == -)
tarjan(i, -);
}
int in[N], out[N];
memset(in, , sizeof(in));
memset(out, , sizeof(out));
for(int i=; i<=n; ++ i)
{
for(int j=; j<=n; ++ j)
{
if(mp[i][j] && belong[i] != belong[j])
{
++ in[belong[j]];
++ out[belong[i]];
}
}
}
if(cou_scc == )
{
printf("1\n0\n");
continue;
}
int x = , y = ;
for(int i=; i<=cou_scc; ++ i)
{
if(in[i] == )
++ x;
if(out[i] == )
++ y;
}
printf("%d\n%d\n", x, max(x, y));
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,996
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,510
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,353
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,137
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848