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

*/


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

相关文章推荐

hiho一下 连通性二·边的双连通分量

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师找到...

无向图双连通分量(ZZ)

无向图的连通分支(连通子图): 判断一个无向图是否连通,如果进行dfs或者bfs之后,还有未访问到的顶点,说明不是连通图,否则连通。 求解无向图的所有连通分支: 只需要重复调用dfs或者bfs ...

图论 无向图的双连通分量(模板) LA5135

#include #include #include #include #include using namespace std; typedef long long ll; const i...

poj 3177 & 3352 【无向图双连通分量Tarjan】

题目:poj 3177 & 3352 题意:大概意思就是给你一个无向图,让你添加最少的边,让所有点都双连通。 分析:双连通的定义就是任意两个点至少有两条路可达。 其实做法跟添加最...

无向图的边双连通分量

无向图边双连通分量:对于一个无向图,任意两点之间

无向图的双连通分量

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

POJ 3352 & 3177 无向图的边-双连通分量(无重边 & 重边)

POJ 3352 Road Construction  链接:http://poj.org/problem?id=3352 题意:给定一张连通的无向图,无重边。问最少加入多少条边之后,使得原图之中...

无向图的点双连通分量(tarjan模板)

#include #include #include #include #include #include using namespace std; #define maxn 7500 #define...

【无向图的双连通分量】

【点-双连通分量】 复制去Google翻译翻译结果

无向图的点双连通分量

点双连通分量:任意两个点之间至少存在两条
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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