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的更多相关文章

  1. 【图论】Network of Schools

    [POJ1236]Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18969   Acc ...

  2. 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools

    [题意] 见:http://blog.csdn.net/ascii991/article/details/7466278 [思路] 缩点+tarjan,思路也可以到上面的博客去看.(吐槽:这道题其实我 ...

  3. 【IOI 1996】 Network of Schools

    [题目链接] 点击打开链接 [算法] 对于第一问,将这个图缩点,输出出度为零的点的个数 对于第二问,同样将这个图缩点,输出入度为零.出度为零的点的个数的最大值 [代码] #include <al ...

  4. POJ1236:Network of Schools (思维+Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24880   Accepted: 99 ...

  5. 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点

    题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...

  6. 【洛谷P2746】Network of Schools

    题目大意:给定一个 N 个点,M 条边的有向图,第一问求至少从多少个点出发才能遍历整个有向图,第二问求至少在这个有向图的基础上加多少条边才能使得该无向图强连通. 题解:先进行 Tarjan 缩点,得到 ...

  7. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  8. 【树形贪心】【UVA1267】Network

    重要意义:复习好久没写的邻接表了. Network, Seoul 2007, LA3902 Consider a tree network with n nodes where the interna ...

  9. 【OpenStack】network相关知识学习

    network 类型 local:通信不跨主机,必须同一网段,主要做单机测试使用: flat:统计可以跨主机,但是需要在同一网段: 每个 flat network 都会独占一个物理网卡 计算节点上 b ...

随机推荐

  1. 使用JspStudy集成环境快速部署jsp项目

    1. 安装jdk 本人网盘资源:https://yunpan.cn/ckZLNbqxkDYYe (提取码:b5e8) 去jdk官网下载最新的jdk: http://www.oracle.com/tec ...

  2. js常见执行方法$(document).load(),$(document).ready()

    $(document).load(); 当web页面以及其附带的资源文件,如CSS,Scripts,图片等,加载完毕后执行此方法.常用于检测页面(及其附带资源)是否加载完毕. $(document). ...

  3. AMAP

    ViewController.m #import "ViewController.h" //地图显示需要的头文件 #import <MAMapKit/MAMapKit.h&g ...

  4. C++中各种数据类型占据字节长度

    准备校招笔试的时候经常遇到C++某个数据类型占据多少个字节的问题,查阅了下资料,总结如下: 首先罗列一下C++中的数据类型都有哪些: 1.整形:int.long 2.字符型:char.wchar_t ...

  5. 一。常用UIView的属性和方法

    1.frame 控件所在的矩形框的位置和尺寸(以父控件的左上角为坐标原点) 2.bounds 控件 控件所在的矩形框的位置和尺寸(以自己的左上角为坐标原点,所以bounds的x/y一般为0) 3.ce ...

  6. Android应用开发中如何使用隐藏API(转)

    一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...

  7. PBR综合小实验视频-狮子XL

    这个是上学时候录的一个策略路由小实验

  8. jsp的三种自定义标签 写法示例

    1.自定义方法标签 引入方式示例: <%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %> 写 ...

  9. 怎么用JS截取字符串中第一个和第二个字母间的部分?

    一.JS中用正则判断字符串是否有匹配正则的字符串部分,格式如下: /[a-zA-Z](.*?)[a-zA-Z]/.test('1a123d45678901a2') “.test”前面的部分是正则表达式 ...

  10. WebGIS空间数据请求访问机制

    通用的WebGIS空间数据请求访问机制如下图所示: 图1 WebGIS空间数据请求访问机制