A - Network of Schools - poj 1236(求连通分量)
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
const int MAXN = 105;
///邻接表变量
struct Edge{int v, next;}e[MAXN*MAXN];
int Head[MAXN], cnt;
void AddEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = Head[u];
Head[u] = cnt++;
}
///tarjan算法变量
int sta[MAXN], inStack[MAXN], top;
int dfn[MAXN], low[MAXN], index;
int belong[MAXN], bnt;
void tarjan(int k)
{
int j;
dfn[k] = low[k] = ++index;
inStack[k] = true;
sta[++top] = k;
for(j=Head[k]; j!=-1; j=e[j].next)
{
int v = e[j].v;
if( !dfn[v] )
{
tarjan(v);
low[k] = min(low[k], low[v]);
}
else if(inStack[v])
low[k] = min(low[k], dfn[v]);
}
if(dfn[k] == low[k])
{
++bnt;
do
{
j = sta[top--];
inStack[j] = false;
belong[j] = bnt;
}
while(k != j);
}
}
void InIt(int N)
{
cnt = bnt = index = 0;
top = 0;
for(int i=1; i<=N; i++)
{
Head[i] = -1;
dfn[i] = false;
}
}
int main()
{
int N;
while(scanf("%d", &N) != EOF)
{
int i, j, u, v;
InIt(N);
for(i=1; i<=N; i++)
{
while(scanf("%d", &v), v)
AddEdge(i, v);
}
for(i=1; i<=N; i++)if(!dfn[i])
tarjan(i);
int r[MAXN]={0}, c[MAXN]={0}, rn=0, cn=0;
for(i=1; i<=N; i++)
for(j=Head[i]; j!=-1; j=e[j].next)
{
u = belong[i], v = belong[e[j].v];
if(u != v)
{
c[u]++;
r[v]++;
}
}
for(i=1; i<=bnt; i++)
{
if(r[i] == 0)rn++;
if(c[i] == 0)cn++;
}
if(bnt == 1)
printf("1\n0\n");
else
printf("%d\n%d\n", rn, max(rn, cn));
}
return 0;
}
A - Network of Schools - poj 1236(求连通分量)的更多相关文章
- Network of Schools POJ - 1236(强连通+缩点)
题目大意 有N个学校,这些学校之间用一些单向边连接,若学校A连接到学校B(B不一定连接到A),那么给学校A发一套软件,则学校B也可以获得.现给出学校之间的连接关系,求出至少给几个学校分发软件,才能使得 ...
- Network of Schools POJ - 1236 (强联通)
一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...
- Network of Schools POJ - 1236 有向强连通图
//题意://给你n个学校,其中每一个学校都和一些其他学校有交流,但是这些边都是单向的.你至少需要给几个学校//传递消息可以使全部学校都收到消息,第二问你最少添加几条边可以使它变成一个强连通图//题解 ...
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13800 Accepted: 55 ...
- poj 2524 求连通分量(并查集模板题)
求连通分量 Sample Input 10 91 21 31 41 51 61 71 81 91 1010 42 34 54 85 80 0Sample Output Case 1: 1Case 2: ...
- POJ 1236 Network of Schools(tarjan求强连通分量+思维)
题目链接:http://poj.org/problem?id=1236 题目大意: 给你一个网络(有向图),有两个任务: ①求出至少同时需要几份副本可以使得整个网络都获得副本 ②至少添加多少信息表(有 ...
- poj1236 Network of Schools ,有向图求强连通分量(Tarjan算法),缩点
题目链接: 点击打开链接 题意: 给定一个有向图,求: 1) 至少要选几个顶点.才干做到从这些顶点出发,能够到达所有顶点 2) 至少要加多少条边.才干使得从不论什么一个顶点出发,都能到达所有顶点 ...
- How Many Tables(POJ 1213 求连通分量)
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)
Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...
随机推荐
- HDU -2674 N!Again(小技巧)
这道题有个小技巧,就是既然是n!,那么对2009求余,只要大于2009!,那么一定是0,在仔细想想会发现,根本到不了2009,只要到2009的最大质因数就行了,为什么呢?因为最大质因数是最大的一个不能 ...
- 退出应用 关闭多个Activity
Activity3 public class Activity3 extends ListActivity { protected void onCreate(Bundle savedInst ...
- javascript 中寻找性能瓶颈
1.如果一个段代码很耗时的话你可以注释掉一部分你认为是很耗时的,或者干脆全部注释掉,然后再一点一点的解开. 2.js优化中最主要的还是对dom操作的优化,单纯的js执行时间是很短的,而js和dom之间 ...
- css布局篇
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- XML and JSON 验证
function ChkJson(strJson) { //判断Json格式是否正确 if (strJson == null || strJson == "") return tr ...
- PHP与memcache和memcached以及安装使用
老规则,在作者寒冰讲之前我们要来明确memcache与memcached这两个东西到底是什么? 说法一: 两个不同版本的php的memcached的客户端 new memcache是pecl扩展库版本 ...
- JS时间的计算,当前日期加一天或者几天的计算
//alert();//debugger;var newriqi="";var jjd=defaultForm.getCellById(sjyxjid).getText();var ...
- Swift中简单的单例设计
import Foundation class Test: NSObject { // 提供单例实例 static let shareInstance = Test() // 私有化构造方法 over ...
- Linux下Fork与Exec使用
Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一, ...
- 全排列算法之Perm算法实现
题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < … < 'y' < 'z',而且给定的字符 ...