【poj1236】 Network of Schools
http://poj.org/problem?id=1236 (题目链接)
题意
给定一个有向图,求:1.至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点;2.至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点。
Solution
先用Tarjan缩点,所以原图就变成了一个有向无环图(DAG),问题1很简单,只要找出图中入度为0的点有几个就可以了。而第2问的话,看起来就觉得好麻烦的样子,可是看了题解后发现原来如此简单。。用ans1记录入度为0的点的个数,ans2记录出度为0的点的个数,让当前点形成连通块的条件是什么呢,所有的点的入度和出度都不为0。将出度为0的点连一条边向入度为0的点,如果还有多余,那么随意向其他点连边即可,所以第二问的答案就是max(ans1,ans2)。当缩点后只有一个点的话,那么就直接输出1和0。
代码
// poj2186
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=2000;
struct edge {int to,next;}e[maxn<<2],ee[maxn<<2];
int s[maxn],dfn[maxn],low[maxn],head[maxn],heade[maxn],f[maxn],r[maxn],c[maxn],pos[maxn],b[maxn][maxn];
int cnt,top,tot,n,ind; void insert(int u,int v) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}
void inserte(int u,int v) {
ee[++cnt].to=v;ee[cnt].next=heade[u];heade[u]=cnt;
}
void Tarjan(int u) {
dfn[u]=low[u]=++ind;
s[++top]=u;
f[u]=1;
for (int i=head[u];i;i=e[i].next) {
if (!dfn[e[i].to]) {
Tarjan(e[i].to);
low[u]=min(low[u],low[e[i].to]);
}
else if (f[e[i].to]) low[u]=min(low[u],dfn[e[i].to]);
}
if (low[u]==dfn[u]) {
tot++;int j;
do {
j=s[top--];
pos[j]=tot;
f[j]=0;
}while (j!=u);
}
}
int main() {
while (scanf("%d",&n)!=EOF) {
ind=0;cnt=0;top=0;
for (int i=1;i<=n;i++) pos[i]=heade[i]=head[i]=s[i]=dfn[i]=low[i]=r[i]=c[i]=0;
for (int i=1;i<=n;i++) {
int x;
while (scanf("%d",&x)!=EOF && x!=0) insert(i,x);
}
for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i);
cnt=0;
for (int i=1;i<=n;i++)
for (int j=head[i];j;j=e[j].next)
if (!b[pos[i]][pos[e[j].to]] && pos[i]!=pos[e[j].to])
inserte(pos[i],pos[e[j].to]);
for (int i=1;i<=tot;i++)
for (int j=heade[i];j;j=ee[j].next) {
r[ee[j].to]++;
c[i]++;
}
int ans1=0,ans2=0;
for (int i=1;i<=tot;i++) if (r[i]==0) ans1++;
for (int i=1;i<=tot;i++) if (c[i]==0) ans2++;
printf("%d\n",ans1);
if (tot==1) printf("0\n");
else printf("%d\n",max(ans1,ans2));
}
return 0;
}
【poj1236】 Network of Schools的更多相关文章
- 【图论】Network of Schools
[POJ1236]Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18969 Acc ...
- 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools
[题意] 见:http://blog.csdn.net/ascii991/article/details/7466278 [思路] 缩点+tarjan,思路也可以到上面的博客去看.(吐槽:这道题其实我 ...
- 【IOI 1996】 Network of Schools
[题目链接] 点击打开链接 [算法] 对于第一问,将这个图缩点,输出出度为零的点的个数 对于第二问,同样将这个图缩点,输出入度为零.出度为零的点的个数的最大值 [代码] #include <al ...
- POJ1236:Network of Schools (思维+Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24880 Accepted: 99 ...
- 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点
题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...
- 【洛谷P2746】Network of Schools
题目大意:给定一个 N 个点,M 条边的有向图,第一问求至少从多少个点出发才能遍历整个有向图,第二问求至少在这个有向图的基础上加多少条边才能使得该无向图强连通. 题解:先进行 Tarjan 缩点,得到 ...
- 【BZOJ】【1834】【ZJOI2010】Network 网络扩容
网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...
- 【树形贪心】【UVA1267】Network
重要意义:复习好久没写的邻接表了. Network, Seoul 2007, LA3902 Consider a tree network with n nodes where the interna ...
- 【OpenStack】network相关知识学习
network 类型 local:通信不跨主机,必须同一网段,主要做单机测试使用: flat:统计可以跨主机,但是需要在同一网段: 每个 flat network 都会独占一个物理网卡 计算节点上 b ...
随机推荐
- GetComponent
GetComponent 的几种写法: 1.AutoRotation cmp1=(AutoRotation) GetComponent(typeof(AutoRotation)); 2.AutoRot ...
- 测试 Mono 安装
测试 Mono 安装 为了测试核心编译器(mcs)和运行时(mono),应该创建一个简单的程序并编译它.可以在喜欢的任何文本编辑器中创建程序.这里采用一种快速而简陋的方法创建该文件(虽然没有任何格式化 ...
- Volley(三)—— ImageRequest & Request简介
Volley(三)—— ImageRequest & Request简介 上 篇文章我们讲 到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型 ...
- 23Spring_JdbcTemplate来实现单表的增删改查
第一步建表:
- MySQL数据备份小结
一 MySQL备份恢复总结: 1,备份所有库 2,分库备份 3,备份某库中的某表 4,备份某库中的多个表 5,分表备份 6,只备份表结构 7,只备份数据 二 MySQL备份恢复参数总结: -A 备份所 ...
- 磁盘操作- inode/Block深入实战
一 思路: 1,磁盘物理结构及大小计算 2,分区 MBR GPT知识 3,fdisk分区 挂载 自动挂载 4,格式化文件系统 5,inode block 软硬链接 查看磁盘: [root@moban ...
- int 与Integer的用法与区别
1.int是基本类型,直接存取数值,Integer是对象,用一个引用指向这个对象. 2.java中的数据类型分为基本数据类型和复杂数据类型,int是前者,Integer是后者(也就是一个类). 3.初 ...
- C#报错:创建调试信息文件 ……obj\Debug\model.pdb: 拒绝访问
错误:创建调试信息文件“.......\obj\Debug\model.pdb”时发生错误 --“......\obj\Debug\model.pdb: 拒绝访问. 解决办法如下: 删除该项目下的 b ...
- CSS 实现加载动画之六-大风车
这个动画改编自光盘旋转,前几个步骤一样,最后一步不同.光盘旋转的最后一步是外层容器加个圆形的白色边框,多余部分隐藏,这个案例则是在每个旋转的子元素的顶部或底部增加一个三角形的元素,构成风车旋转的角. ...
- Spring验证的错误返回------BindingResult
Spring验证的错误返回------BindingResult 参考资料:http://www.mkyong.com/spring-mvc/spring-mvc-form-errors-tag-ex ...