hiho一下 第五十三周(无向图的双连通分量)

原创 2015年07月10日 16:48:52

这道题要求将无向图按照点-双连通来分块。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int INF=1<<29;
const int maxn=20001;
const int maxm=100012*2;
int e=0,pnt[maxm],nxt[maxm],head[maxm];
int low[maxn],vis[maxn],dfn[maxn],belong[maxn],st[maxn];
int n,m,depth,cnt,top;
int num[maxn];

void init()
{
    e=0;
    memset(head,-1,sizeof(head));
    top=depth=cnt=0;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)num[i]=INF;
}
void AddEdge(int u,int v)
{
    pnt[e]=v;
    nxt[e]=head[u];
    head[u]=e++;
}
void dfs(int now,int father)
{
    //printf("%d %d\n",now,father);
    low[now]=dfn[now]=++depth;
    vis[now]=1;
    st[top++]=now;
    for(int i=head[now]; i!=-1; i=nxt[i])
    {
        if(!dfn[pnt[i]])
        {
            dfs(pnt[i],now);
            low[now]=min(low[now],low[pnt[i]]);
        }
        else if(pnt[i]!=father)
            low[now]=min(low[now],dfn[pnt[i]]);
    }
    if(low[now]==dfn[now])
    {
        cnt++;
        int j;
        while(j=st[--top])
        {
            belong[st[top]]=cnt;
            if(j==now) break;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    init();
    for(int i=0; i<m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        AddEdge(u,v);
        AddEdge(v,u);
    }
    dfs(1,-1);
//    for(int i=1;i<=n;i++)
//       printf("%d ",belong[i]);puts("");
//    for(int i=1;i<=n;i++)
//       printf("%d ",belong[i]);puts("");
    for(int i=1;i<=n;i++)
    {
        int t=belong[i];
        num[t]=min(num[t],i);
    }
    printf("%d\n",cnt);
    for(int i=1;i<=n;i++)
        printf("%d%c",num[belong[i]],i==n?'\n':' ');
    return 0;
}
/*
6 7
1 4
4 5
5 1
4 2
2 3
3 6
6 2

*/


版权声明:本文为博主原创文章,未经博主允许不得转载。

无向图的割顶和桥,无向图的双连通分量入门详解及模板

割顶和桥:对于无向图G,如果删除某个节点u后,连通分量数目增加,则称u为图的割顶;如果删除某条边后,连通分量数目增加,则称该边为图的桥。对于连通图删除割顶或桥后都会使得图不再连通以下我,我们利用dfs...
  • STILLxjy
  • STILLxjy
  • 2017年04月14日 22:56
  • 1209

无向图的割点,桥,双连通分量,有向图的强连通分量总结

一、无向图的割点,桥,双连通分量
  • Guard_Mine
  • Guard_Mine
  • 2014年08月17日 13:30
  • 1586

无向图的双连通分量

无向图的双连通分量 点-双连通图:对于一个无向连通图,如果任意两个点至少存在两条”点不重复”的路径,则说这个图是点-双连通的.这个要求等价于任意两条边都在同一个简单环内,即内部无割顶. 注意:孤立...
  • u013480600
  • u013480600
  • 2014年06月16日 21:17
  • 1032

双连通分量模板以及对一些不好理解点的解释

概念: 双连通分量有点双连通分量和边双连通分量两种。若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连 通性,即不存在割点(桥),则称作点(边)双连通图。一个无向图中的每一个极大点(边)双连...
  • yo_bc
  • yo_bc
  • 2017年06月09日 18:32
  • 315

无向图的双连通分量

无向图的双连通分量         点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图。         注意:孤立点,以及两点一边这两种图都是点-双连通的。因为它们都是内部无割点...
  • u013480600
  • u013480600
  • 2015年04月02日 18:45
  • 2238

poj 3177 poj 3352 (边双连通分量裸题+缩点)

题目:http://poj.org/problem?id=3177 题意: 这两题几乎一样,都是给一个连通图,问最少加几条边可以得到边双连通图。 分析: 先求出边双连通分量(low[i]值相...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年10月02日 19:12
  • 191

tarjan算法(边的双连通分量)

hiho链接:http://hihocoder.com/contest/hiho53/problem/1 边的双连通分量定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通...
  • qwe2434127
  • qwe2434127
  • 2015年08月09日 18:05
  • 1294

Tarjan三大算法之双连通分量(双连通分量)

定义: 对于一个连通图,如果任意两点至少存在两条点不重复路径,则称这个图为点双连通的(简称双连通);如果任意两点至少存在两条边不重复路径,则称该图为边双连通的。点双连通图的定义等价于任意两条边都同在...
  • fuyukai
  • fuyukai
  • 2016年05月03日 16:18
  • 9104

(POJ 3352)无向图的边双连通分量模板题 + 在一个图中最少加几条边可以使得图边双连通

Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11779 Acc...
  • STILLxjy
  • STILLxjy
  • 2017年04月20日 20:07
  • 415

hihoCoder_#1184_连通性二·边的双连通分量

#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,...
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2015年07月31日 22:11
  • 952
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hiho一下 第五十三周(无向图的双连通分量)
举报原因:
原因补充:

(最多只允许输入30个字)