题目链接:

  Poj 1236 Network of Schools

题目描述:

  有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个网络才能够让所有学校被网络覆盖?2:至少要加几条线路就能做到在任意一个学校安装网络都可以覆盖全部学校?

解题思路:

  先用Tarjan对强连通分量进行缩点,然后对缩点以后的图进行处理,统计图中节点出度为零的有多少,入度为零的有多少个?

  因为入度为零的点不能由其他的点到达,在每个入度为零的节点安装网络可以让所有学校被网络覆盖。

  全部学校在一个强连通图里面,就可以实现第二问,因为出度为零的节点不能到达其他节点,入度为零的点不能由其他节点进来,所以要对出度为零加出度,入度为零的便加入度即可。PS:当全图只有一个连通块的时候应该不用加边的。

 #include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = ;
struct node
{
int to ,next;
} edge[maxn*maxn];
int head[maxn], dfn[maxn], low[maxn], in[maxn], out[maxn], id[maxn];
int tot, cnt, top, time, instack[maxn], stack[maxn];
void init ()
{
tot = top = ;
cnt = time = ;
memset (head, -, sizeof(head));
memset (dfn, , sizeof(dfn));
memset (low, , sizeof(low));
memset (in, , sizeof(in));
memset (out, , sizeof(out));
memset (id, , sizeof(id));
memset (instack, , sizeof(instack));
memset (stack, , sizeof(stack));
}
void Add (int from, int to)
{
edge[tot].to = to;
edge[tot].next = head[from];
head[from] = tot ++;
}
void Tarjan (int u)
{
dfn[u] = low[u] = ++time;
instack[u] = ;
stack[top ++] = u;
for (int i=head[u]; i!=-; i=edge[i].next)
{
int v = edge[i].to;
if (!dfn[v])
Tarjan (v);
if (instack[v])
low[u] = min (low[u], low[v]);
}
if (dfn[u] == low[u])
{
cnt ++;
while ()
{
int v = stack[--top];
instack[v] = ;
id[v] = cnt;
if (v == u)
break;
}
}
}
int main ()
{
int n;
while (scanf ("%d", &n) != EOF)
{
init ();
for (int i=; i<=n; i++)
{
int to;
while (scanf ("%d", &to), to)
Add (i, to);
}
for (int i=; i<=n; i++)
if (!dfn[i])
Tarjan (i);
for (int i=; i<=n; i++)
for (int j=head[i]; j!=-; j=edge[j].next)
{
int v = id[i];
int u = id[edge[j].to];
if (v != u)
{
out[v] ++;
in[u] ++;
}
}
int In, Out;
In = Out = ;
for (int i=; i<=cnt; i++)
{
if (!in[i])
In ++;
if (!out[i])
Out ++;
}
if (cnt == )
printf ("1\n0\n");
else
printf ("%d\n%d\n", In, max(In, Out));
}
return ;
}

最新文章

  1. dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
  2. OpenCASCADE PCurve of Topological Face
  3. 跟我学-Java底层技术系列文章
  4. python操作数据库
  5. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷&#183;一
  6. iOS 中使用md5加密
  7. HTML5 面试中最常问到的 10 个问题
  8. ios文本常见属性
  9. Nmon 性能:分析 AIX 和 Linux 性能的免费工具
  10. windows下python的安装
  11. Power BI官方视频(4) Power BI Desktop 2017年首次更新先睹为快
  12. 51nod 1364 最大字典序排列(线段树)
  13. css的position
  14. 「Django」contenttypes基本用法
  15. Hive笔记之Fetch Task
  16. 指定文件兼容性模式 &lt; meta http-equiv = &quot;X-UA-Compatible&quot; content = &quot;IE=edge,chrome=1&quot; /&gt;的意义
  17. Django 安装 —Django学习 (一)
  18. Java基础1-反射篇
  19. 【Mac】解决「另一个活跃的 Homebrew 进程正在进行中」问题
  20. Angular路由参数传递

热门文章

  1. Labeling Balls(poj 3687)
  2. Git Cheat Sheet 中文版
  3. easyUi 学习笔记 (二 ) 使用tabs 里datagridview 发送ajax请求 不访问后台的问题
  4. Oldboy 基于Linux的C/C++自动化开发---MYSQL
  5. Android GIS开发系列-- 入门季(11) Callout气泡的显示
  6. k-d树及八叉树
  7. Ubuntu 16.04 LTS 搭建LAMP
  8. HDU 3280 Equal Sum Partitions(二分查找)
  9. hiho一下 第五十一周(有向图欧拉路径)51
  10. SPOJ 15. The Shortest Path 最短路径题解