题目大意:

N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

链接http://vjudge.net/problem/viewProblem.action?id=17001

每个强连通分量内只要有任意一个学校获得一份软件就可以了,因为强连通分量内的任意两点是相互可达的。

也就是说,在一个强联通分量内的学校可以当作一个学校!

那么第一问我们所求的就是强连通分量重入度为零的点

而第二问因为两个强连通合并必然是出度为0的连接入度为0的点,所以要解决掉入度为0,和出度为0的点,所以答案是这两个的最大值(点指缩点)。

利用scc[i]=scc_cnt 来记录i这个点属于scc_cnt这个连通分量

总代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
#define N 105
int first[N],scc[N],dfn[N],low[N],degreeIn[N],degreeOut[N],k,n,tmpdfn,scc_cnt;
stack<int> q;
struct Path{
int y,next;
}path[];
void init()
{
memset(first,-,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(degreeIn,,sizeof(degreeIn));
memset(degreeOut,,sizeof(degreeOut));
memset(scc,,sizeof(scc));
scc_cnt=,tmpdfn=,k=;
}
void add(int x,int y)
{
path[k].y=y,path[k].next=first[x];
first[x]=k;
k++;
}
void dfs(int u)
{
dfn[u]=low[u]=++tmpdfn;
q.push(u);
for(int i=first[u];i!=-;i=path[i].next){
int v=path[i].y;
if(!dfn[v]){
dfs(v);
low[u]=min(low[v],low[u]);
}
else if(!scc[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
scc_cnt++;
for(;;){
int v=q.top(); q.pop();
scc[v]=scc_cnt;
if(u==v) break;
}
}
}
void get_scc()
{
while(!q.empty()) q.pop();
for(int i=;i<=n;i++)
if(!dfn[i]) dfs(i);
//cout<<"OK"<<endl;
for(int i=;i<=n;i++){
for(int j=first[i];j!=-;j=path[j].next){
int v=path[j].y;
//cout<<v<<endl;
if(scc[i]!=scc[v]){
degreeOut[scc[i]]++;
degreeIn[scc[v]]++;
}
}
}
}
int main()
{
int i,a;
while(~scanf("%d",&n)){
int ans1=,ans2=;
init();
for(i=;i<=n;i++){
while(scanf("%d",&a) && a) add(i,a);
}
get_scc();
//for(int i=1;i<=scc_cnt;i++) cout<<degreeIn[i]<<endl;
//cout<<scc_cnt<<endl;
for(int i=;i<=scc_cnt;i++){
if(!degreeOut[i]) ans1++;
if(!degreeIn[i]) ans2++;
}
ans1=max(ans1,ans2);
//cout<<"Á¬Í¨·ÖÁ¿£º"<<cnt<<endl;
if(scc_cnt>){
printf("%d\n",ans2);
printf("%d\n",ans1);
}
else printf("1\n0\n");
}
return ;
}

POJ 1236 学校网络间的强连通的更多相关文章

  1. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  2. POJ 1236 Network of Schools(强连通分量)

    POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...

  3. POJ 1236 学校传数据 强连通+缩点+DAG

    题意描述: 网络中有一些学校,每个学校可以分发软件给其他学校.可以向哪个分发取决于他们各自维护的一个清单. 两个问题 1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到. 2:要在所 ...

  4. POJ 1236 Network of Schools(强连通分量/Tarjan缩点)

    传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...

  5. poj 1236 Network of Schools(又是强连通分量+缩点)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  6. poj 1236 Network of Schools (强连通分量+缩点)

    题目大概: 每个学校都可以把软件复制好,交给它名单上的学校. 问题A:把软件复制成几份,然后交给不同的学校,所有学校才能够都有软件. 问题B:添加几条边,能使得这个图变成强连通图. 思路: 找出所有的 ...

  7. poj 1236 Network of Schools(强连通、缩点、出入度)

    题意:给出一个有向图.1:问至少选出多少个点,才能沿有向边遍历所有节点.2:问至少加多少条有向边,使原图强连通. 分析:第一个问题,缩点后找所有树根(入度为0).第二个问题,分别找出入度为0和出度为0 ...

  8. poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13800   Accepted: 55 ...

  9. POJ 1236.Network of Schools (强连通)

    首先要强连通缩点,统计新的图的各点的出度和入度. 第一问直接输出入度为0的点的个数 第二问是要是新的图变成一个强连通图,那么每一个点至少要有一条出边和一条入边,输出出度和入度为0的点数大的那一个 注意 ...

随机推荐

  1. C. Jon Snow and his Favourite Number DP + 注意数值大小

    http://codeforces.com/contest/768/problem/C 这题的数值大小只有1000,那么可以联想到,用数值做数组的下标,就是类似于计数排序那样子.. 这样就可以枚举k次 ...

  2. Unity3d中UnityEngine.Object

    UnityEngine.Object继承自system.Object,是Unity所涉及所有物体的基类. Static Functions 静态函数   下面的都是静态函数 Destroy Remov ...

  3. R 关于全局变量

    不得不吐槽了 写了这么多,竟然今天才发现R的全局变量在函数名空间里是不能赋值的,我去!!! 就是说在函数里面,全局变量名是可读的,但不可写(写的时候 又会创建新的 自由变量了)

  4. AJPFX关于hashmap和hashtable 的区别

    Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...

  5. Android提供的对话框

    1.普通对话框: 给出提示信息,有yes.no两个按钮. AlertDialog dialog=new AlertDialog.Builder(this) //this代表当前Activity对象,表 ...

  6. 【学习笔记】OSG 基本几何图元

    例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...

  7. CMSIS的简介

    Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由A ...

  8. SVN与TFS自动同步脚本(很实用)

    一直都在园子里看文章,因为各种原因懒得写文章.最近稍得空闲,把这几天的工作成果分享一下. 因为工作需要,开发人员使用Qt进行系统移动端的开发,Qt的版本控制却不提供连接TFS的设置,只有使用svn.没 ...

  9. Linux php安装zip扩展

    Linux php安装zip扩展 2018.07.22 22:40 1165浏览   #wget http://pecl.php.net/get/zip-1.12.4.tgz #tar zxfv zi ...

  10. strict说明