[POJ 1236][IOI 1996]Network of Schools
Description
in the distribution list of school A, then A does not necessarily appear in the list of school B
You are to write a program that computes the minimal number of schools that must receive a copy of the new software in order for the software to reach all schools in the network according to the agreement (Subtask A). As a further task, we want to ensure that
by sending the copy of new software to an arbitrary school, this software will reach all schools in the network. To achieve this goal we may have to extend the lists of receivers by new members. Compute the minimal number of extensions that have to be made
so that whatever school we send the new software to, it will reach all other schools (Subtask B). One extension means introducing one new member into the list of receivers of one school.
Input
the identifiers of the receivers of school i. Each list ends with a 0. An empty list contains a 0 alone in the line.
Output
Sample Input
5
2 4 3 0
4 5 0
0
0
1 0
Sample Output
1
2
Source
题目大意:给定一个有向图,求至少要有多少个点, 才干从这些点出发到达全部点;至少要加入多少条边,才干从随意一点出发到达全部点
首先要推出一个定理:在DAG中,对于全部入度不为0的点,一定有入度为0的点可达(由于从入度为0的点倒着走,一定能走到入度不为0的点)
于是此题可用tarjan缩点,求有多少个入度为0的点,这就是第一个问题的答案。
第二个问题的答案为入度为0的点和出度为0的点的最小值。证明比較难。略。
对于这道题,由于仅仅要求入度和出度为0的点,故仅仅需在tarjan过程中记录每一个点归属哪个强连通分量。然后统计输出就可以
#include <iostream>
#include <stdio.h>
#include <string.h> #define MAXE 500
#define MAXV 3000 using namespace std; int N; struct edge
{
int u,v,next;
}edges[MAXV]; int head[MAXE],nCount=0;
int dfn[MAXE],low[MAXE],index=0;
int belong[MAXE],tot=0; //belong[i]=i点所属的强连通分量,tot=强连通分量总数
bool inStack[MAXE];
int stack[MAXE*4],top=0;
bool map[MAXE][MAXE];
int inDegree[MAXE],outDegree[MAXE],inZero=0,outZero=0; //入度。出度 int max(int a,int b)
{
if(a>b) return a;
return b;
} int min(int a,int b)
{
if(a<b) return a;
return b;
} void AddEdge(int U,int V)
{
edges[++nCount].u=U;
edges[nCount].v=V;
edges[nCount].next=head[U];
head[U]=nCount;
} void tarjan(int u)
{
dfn[u]=low[u]=++index;
stack[++top]=u; //该点入栈
inStack[u]=true;
for(int p=head[u];p!=-1;p=edges[p].next)
{
int v=edges[p].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(inStack[v])
{
low[u]=min(low[u],dfn[v]);
}
}
int v;
if(dfn[u]==low[u])
{
tot++;
do
{
v=stack[top--];
belong[v]=tot;
inStack[v]=false;
}
while(u!=v);
}
} int main()
{
int to;
cin>>N;
memset(head,-1,sizeof(head));
for(int i=1;i<=N;i++)
{
while(1)
{
cin>>to;
if(to==0) break;
AddEdge(i,to);
map[i][to]=true;
}
}
for(int i=1;i<=N;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
if(map[i][j]&&belong[i]!=belong[j])
{
inDegree[belong[j]]++;
outDegree[belong[i]]++;
}
}
for(int i=1;i<=tot;i++)
{
if(!inDegree[i]) inZero++;
if(!outDegree[i]) outZero++;
}
if(tot==1) cout<<1<<endl<<0<<endl;
else cout<<inZero<<endl<<max(inZero,outZero)<<endl;
return 0;
}
[POJ 1236][IOI 1996]Network of Schools的更多相关文章
- POJ 1236——Network of Schools——————【加边形成强连通图】
Network of Schools Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u ...
- poj 1236 Network of Schools(又是强连通分量+缩点)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- [tarjan] poj 1236 Network of Schools
主题链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K To ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- POJ 1236 Network of Schools (有向图的强连通分量)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9073 Accepted: 359 ...
- poj 1236 Network of Schools(连通图入度,出度为0)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- POJ 1236 Network of Schools(强连通分量)
POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...
随机推荐
- maven编译错误,警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除
修改红色部分版本号为2.3.2 <plugin> <groupId>org.apache.maven.plugins& ...
- java Class的 getSuperclass与getGenericSuperclass区别
Class的getInterfaces与getGenericInterface区别 http://www.cnblogs.com/maokun/p/6773076.html 一.getSupercla ...
- slf4j log4j logback log4j2关系详解和相关用法
来源:slf4j log4j logback关系详解和相关用法https://www.cnblogs.com/Sinte-Beuve/p/5758971.html The Simple Logging ...
- Unity的shader学习1
先来看一段我们项目常见的Shader代码,这个是Vertex&Fragment shader,目前已经不常用了,不过还是适合我们理解一些基础知识和理解一些比较老的shader 代码.下次我们再 ...
- JDBC的批量插入操作
在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下: ①使用Connection建立数据库连接: ②使用PreparedStatement提交SQL语句,将数据插入: ...
- ZeroMQZeroMQ研究与应用分析
1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应用 ...
- go语言基础之range的用法
一.range的用法 示例1: 传统用法 package main //必须有一个main包 import "fmt" func main() { str := "abc ...
- EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他
原创 : EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他 转载,请注明出处哦!谢谢! 原创 : EasyUI datagrid 明细表格中编辑框 事件绑 ...
- Android -- Options Menu,Context Menu,Popup Menu
Options Menu 创建选项菜单的步骤: 1. ...
- Ubuntu 16.04 LTS软件包管理基本操作
前文 Ubuntu 16.04 新特性中我们已经介绍过,随着 Ubuntu 16.04 LTS 的发布,Ubuntu 的软件包管理命令也发生了变化,新系统采用了 Debian 项目中所使用的 APT( ...