POJ 1236 Network of Schools 有向图强连通分量

参考这篇博客:

http://blog.csdn.net/ascii991/article/details/7466278

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <stack>
using namespace std;
typedef long long LL;
const int N = 1e2+5;
int head[N],tot,p,h[N],n,out[N],in[N];
struct Edge{
   int u,v,next;
}edge[N*N],e[N*N];
void add(int u,int v){
   edge[tot].u=u;
   edge[tot].v=v;
   edge[tot].next=head[u];
   head[u]=tot++;
}
void addedge(int u,int v){
   e[p].v=v;
   e[p].next=h[u];
   h[u]=p++;
}
int clk,dfn[N],low[N],cnt,bel[N];
bool instack[N];
stack<int>s;
void targin(int u){
   dfn[u]=low[u]=++clk;
   s.push(u);
   instack[u]=true;
   for(int i=head[u];~i;i=edge[i].next){
      int v=edge[i].v;
      if(!dfn[v]){
         targin(v);
         low[u]=min(low[u],low[v]);
      }
      else if(instack[v])
        low[u]=min(low[u],dfn[v]);
   }
   if(dfn[u]==low[u]){
      ++cnt;
      int k;
      do{
        k=s.top();
        s.pop();
        instack[k]=false;
        bel[k]=cnt;
      }while(k!=u);
   }
}
int main(){
    scanf("%d",&n);
    memset(head,-1,sizeof(head));
    memset(h,-1,sizeof(h));
    for(int i=1;i<=n;++i){
        for(int x;;){
           scanf("%d",&x);
           if(!x)break;
           add(i,x);
        }
    }
    for(int i=1;i<=n;++i)
      if(!dfn[i])targin(i);
    if(cnt==1){
        printf("1\n0\n");
        return 0;
    }
    for(int i=0;i<tot;++i){
        int k1=bel[edge[i].u],k2=bel[edge[i].v];
        if(k1==k2)continue;
        addedge(k1,k2);
        ++in[k2];
        ++out[k1];
    }
    int ans1=0,ans2=0;
    for(int i=1;i<=cnt;++i){
      if(!in[i])++ans1;
      if(!out[i])++ans2;
    }
    printf("%d\n%d\n",ans1,max(ans1,ans2));
    return 0;
}

时间: 2024-10-06 06:31:51

POJ 1236 Network of Schools 有向图强连通分量的相关文章

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

POJ 1236 Network of Schools 链接:http://poj.org/problem?id=1236 题意:有一些学校连接到一个计算机网络.这些学校之间达成了一个协议:每个学校维护着一个学校列表,它向学校列表中的学校发布软件.注意,如果学校B 在学校A 的列表中,则A 不一定在B 的列表中. 任务A:计算为使得每个学校都能通过网络收到软件,你至少需要准备多少份软件拷贝. 任务B:考虑一个更长远的任务,想确保给任意一个学校发放一个新的软件拷贝,该软件拷贝能发布到网络中的每个学

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

POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入?几条边使得有向图成为一个强连通图. 分析: 跟HDU 2767 Proving Equivalences(题解)一样的题目,只是多了个问题,事实上转化成DAG后就不难考虑了,事实上仅仅要选择入度为0的点即可了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> *

poj 1236 Network of Schools 【强连通图】

题目:poj 1236 Network of Schools 类似题目hdoj 2767 3836 /*******以下kuang大神的解释,写的很好就不解释了*************************/ 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输,问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.2,至少需要添加几条传输线路(边),使任

Poj 1236 Network of Schools (Tarjan)

题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个网络才能够让所有学校被网络覆盖?2:至少要加几条线路就能做到在任意一个学校安装网络都可以覆盖全部学校? 解题思路: 先用Tarjan对强连通分量进行缩点,然后对缩点以后的图进行处理,统计图中节点出度为零的有多少,入度为零的有多少个? 因为入度为零的点不能由其他的点到达,在每个入度为零的节点安装网络可

[tarjan] poj 1236 Network of Schools

题目链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11433   Accepted: 4551 Description A number of schools are connected to a computer network. Agreements have been developed among thos

poj 1236 Network of Schools(连通图入度,出度为0)

http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13046   Accepted: 5215 Description A number of schools are connected to a computer network. Agreements have been developed among those scho

POJ - 1236 Network of Schools(有向图的强连通分量)

d.各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输, 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件.s.首先找强连通分量,然后看强连通分量的入度为0点的总数,出度为0点的总数. 第一问为入度为0的强连通分量的个数. 第二问为入度为0的个数和出度为0的个数中大的.(将这个图的所有子树找出来,然后将一棵子树的叶子结

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

题目地址:POJ 1236 这个题的大意是求最少往多少点发送消息可以使任意一个点都能收到消息和最少增加多少条边可以使图为连通图.对于第一个问题,可以求入度为0的强连通块的块数,因为只有入度为0的强连通块是无法从外界接受信息的,而只要有一个入度的话,那整个连通块就都可以接收到信息.第二个问题则是求入度为0的强连通块与出度为0的强连通块的个数的最大值. 代码如下: #include <iostream> #include <cstdio> #include <string>

[ACM] poj 1236 Network of Schools (有向强连通分量)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11407   Accepted: 4539 Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a li