关闭

POJ1236 Network of Schools 强连通+缩点

566人阅读 评论(0) 收藏 举报
分类:

题目链接:

poj1236




题意:

给出一幅有向图,给出图中所有的边。问:

1.要遍历完图的所有顶点,需要遍历多少次(可以从不同起点)

2.要想只遍历一次,经过图中所有顶点(强连通)最少 需要增加多少条边



题解思路:

首先就是缩点重新建图

对于问题1:

要遍历整个图,只需要从图的所有起点开始遍历

这里图中的起点就是入度为0的点,起点个数即为遍历次数。

对于问题2:

要想使原图成为强连通图

需要保证图中没有入度为0或出度为0的顶点;

而每增加一条边 的  最优连接策略 是   从一个出度为0的顶点到一个入度为0的顶点

这样 需要增加的最少边数即为   入度为0的顶点个数 和   出度为0的顶点个数   之间的最大值


另外需要注意图中只有一个强连通分量的特殊情况(重建图后只有一个顶点):

需要的遍历次数为1

需要的最少边数为0


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 105
using namespace std;
struct node{
    int to,next;
}edge[maxn*maxn];
int head[maxn];
int s;

int dfn[maxn],low[maxn],num;

int insta[maxn],sta[maxn],top;

int belong[maxn],block;
void init()
{
    memset(head,-1,sizeof(head));
    memset(dfn,0,sizeof(dfn));
    memset(insta,0,sizeof(insta));
    memset(belong,0,sizeof(belong));
    top=num=s=block=0;
}

void Tarjan(int u,int pre)
{
    dfn[u]=low[u]=++num;
    insta[u]=1;
    sta[top++]=u;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(!dfn[v])
        {
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
        }
        else if(insta[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        int d=-1;
        block++;
        while(d!=u)
        {
            d=sta[--top];
            insta[d]=0;
            belong[d]=block;
        }
    }
}

void rebuild(int n)
{
    int in[maxn]={0};
    int out[maxn]={0};
    int u,v;
    for(int i=1;i<=n;i++)
    {
        u=belong[i];
        for(int j=head[i];j!=-1;j=edge[j].next)
        {
            v=edge[j].to;
            v=belong[v];
            if(u!=v)
            {
                in[v]++;
                out[u]++;
            }
        }
    }
    int s1=0,s2=0;
    for(int i=1;i<=block;i++)
    {
        if(!in[i])
            s1++;
        if(!out[i])
            s2++;
    }
    if(s1==0)
        cout<<1<<endl;
    else
        cout<<s1<<endl;
    if(block==1)
        cout<<0<<endl;
    else
        cout<<max(s1,s2)<<endl;
}

int main()
{
//    freopen("in.txt","r",stdin);
    int n,a,b;
    while(~scanf("%d",&n))
    {
        init();
        for(int i=1;i<=n;i++)
        {
            while(scanf("%d",&a)&&a)
            {
                edge[s]={a,head[i]};
                head[i]=s++;
            }
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])
                Tarjan(i,-1);
        rebuild(n);
    }
    return 0;
}




0
0
查看评论

poj1236 Network of Schools(强连通-缩点)

Network of Schools Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Submission(s) : 2 ...
  • u013634213
  • u013634213
  • 2014-08-16 23:38
  • 429

POJ1236 Network of Schools 强连通+缩点

<br />Problem Address:http://poj.org/problem?id=1236<br /> <br />看题后觉得是和连通分支有很大关系的,也有关于入度和出度的。<br /> <br />所以上...
  • Human_CK
  • Human_CK
  • 2011-02-25 10:40
  • 627

poj1236 - Network of Schools

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410              &...
  • wangjian8006
  • wangjian8006
  • 2012-08-20 23:56
  • 3882

POJ1236_A - Network of Schools _强连通分量::Tarjan算法

题意有向图上有 N 个点,若干有向边。 第一问:至少给几个点传递信息,才能保证信息传遍整个图。 第二问:至少添加几条边,才能使任意选择点,都能传遍整个图。
  • yuege38
  • yuege38
  • 2017-07-15 14:35
  • 148

POJ1236:Network of Schools(强连通)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19179   Accepted: 7536...
  • junior19
  • junior19
  • 2017-08-12 17:59
  • 58

poj1236——Network of Schools(强连通分量+缩点)

Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15674 Accepted: 6213 DescriptionA number of schools are c...
  • mosquito_zm
  • mosquito_zm
  • 2016-07-30 15:53
  • 143

POJ1236 Network of Schools(强连通分量+缩点)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20228   Accepted: 7969...
  • tianwei0822
  • tianwei0822
  • 2018-01-14 08:40
  • 50

POJ-1236 Network of Schools 强连通+缩点

题意:        N个学校有网络相连 每个学校维护着一个学校列表,它向学校列表中的学校发布软件;(单向发布);        任务A: 为使每个学校都能通过网络收到软件,至少需要准备多少份软件拷贝   &#...
  • u011742541
  • u011742541
  • 2013-12-09 16:41
  • 384

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

A - Network of Schools Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld &...
  • haut_ykc
  • haut_ykc
  • 2016-08-12 19:35
  • 166

poj1236 Network of Schools (Targan强连通图缩点)

第一道连通图题吧以此纪念下 题意:给一张有向无环图有两个任务1.最至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2.至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点解题思路: 1. 求出所有强连通分量 2. 每个强连通分量缩成一点,则形成一个有向无环图DAG。 ...
  • m0_38013346
  • m0_38013346
  • 2017-10-06 23:38
  • 79