这道题的意思是就是

问题

1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。

2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

其实问题1就是问,这个图的支配集有多少???解决这个问题非常简单,把图缩点后,找到有多少个入度为0的点,就是支配集。一个支配内,所有点可能不是强连通的,但是都可以通过这个点到达。

而问题二其实更加简单,我们只需要把入读为0的点和出度为0的点的数目取一个最大值即可,至于问什么,很简单,我们可以把出度为0的点连接到入度为0的点上面去,这样就保证图的强连通性质。其实这就是求一个图的补图。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = ,M=;
int ver[M],Next[M],head[N],dfn[N],low[N];
int sta[N],ins[N],c[N],in_deg[N],out_deg[N];
int n,m,tot,num,top,cnt;
void add(int x,int y)
{
ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void tarjan(int x)
{
dfn[x]=low[x]=++num;//序列号+1
sta[++top]=x,ins[x]=;//入栈,并标记在栈内
for (int i=head[x]; i; i=Next[i]) //开始访问
if(!dfn[ver[i]]) //如果没有被处理过
{
tarjan(ver[i]);//DFS
low[x]=min(low[x],low[ver[i]]);
//递归出来,比较谁是谁的儿子/父亲,就是树的对应关系,涉及到强连通分量子树最小根的事情
}
else if (ins[ver[i]])
low[x]=min(low[x],dfn[ver[i]]);
//比较谁是谁的儿子/父亲。就是链接对应关系
if (dfn[x] == low[x])//发现是整个强连通分量的子树里面的最小根。
{
cnt++;
int y;
do
{
y=sta[top--],ins[y]=;
c[y]=cnt;
//scc[cnt].push_back(y);
}
while(x!=y);
}
}
void solve(int n)
{
for (int i=; i<=n; i++)
{
if (!dfn[i])
{
tarjan(i);
}
}
if (cnt==)
{
printf("1\n0\n");
return;
}
for (int u=; u<=n; ++u)
{
for (int j=head[u]; j; j=Next[j])
{
int v=ver[j];
if (c[u]==c[v])
{
continue;
}
out_deg[c[u]]++;
in_deg[c[v]]++;
}
}
int a,b;
a=;
b=;
for (int i=; i<=cnt; i++)
{
if (in_deg[i]==)
{
a++;
}
else if (out_deg[i]==)
{
b++;
}
}
printf("%d\n",a);
printf("%d\n",max(a,b)); }
void init()
{
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(head,,sizeof(head));
memset(in_deg,,sizeof(in_deg));
memset(out_deg,,sizeof(out_deg));
memset(ins,,sizeof(ins));
top=;
tot=;
cnt=;
num=;
}
int main()
{
int tmp;
while(~scanf("%d",&n))
{
init();
for (int i=; i<=n; i++)
{
while(scanf("%d",&tmp)&&tmp)
{
add(i,tmp);
}
}
solve(n);
}
return ;
}

最新文章

  1. Django model.py表单的默认值 默认允许为空
  2. C语言解析Ini格式文件
  3. Spark Streaming容错的改进和零数据丢失
  4. opencv--图像轮廓检测
  5. Dalvik VM (DVM) 与Java VM (JVM)之间有哪些区别?
  6. 如何让DIV在窗口水平和垂直居中
  7. 如何实现wpf的多国语言
  8. Linux命令(2):ls命令
  9. HTML+CSS基础学习笔记(7)
  10. Matlab近期用到的函数(持续更新)
  11. 同步特定源代码到 omni_rom源代码目录里面
  12. drupal7 boost模块为登录用户提供缓存
  13. kafka 0.10.2 cetos6.5 集群部署
  14. HDU - 1827 Summer Holiday (强连通)
  15. ROS * 了解学习urdf的内容格式及编写
  16. HDU 4913 Least common multiple
  17. weinre 远程调试 安装 配置
  18. split应用
  19. hdu Constructing Roads (最小生成树)
  20. 01_Flume基本架构及原理

热门文章

  1. python 产生二项分布图练习
  2. python的工具pip进行安装时出现 No module named &#39;pip&#39;
  3. CentOS7安装步骤
  4. DateTimeFormatter
  5. JSP页面中验证码的调用方法
  6. sqlserver 取月初月末的时间
  7. Liferay 7 module项目的依赖问题
  8. List分页
  9. 外贸电子商务网站之Prestashop 安装后台中文语言包
  10. TP3.2的URL重写省略index.php问题