美文网首页
2018-07-18-连通图&邻接多重表

2018-07-18-连通图&邻接多重表

作者: termanary | 来源:发表于2018-07-19 16:25 被阅读0次

题目:HDOJ-1232

代码:(用邻接多重表求连通图个数)

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct graph
{
    int v1,v2;
    struct graph *n1,*n2;
}*gra;

gra *p;
int n,m;

int dfs(const int fi)
{
    gra tmp,cn;
    int se;
    tmp=p[fi];
    if(tmp==NULL)
        return 0;
    for(;tmp!=NULL;tmp=p[fi])
    {
        p[fi]=fi==tmp->v1?tmp->n1:tmp->n2;
        se=fi!=tmp->v1?tmp->v1:tmp->v2;
        if(tmp->v1!=tmp->v2)
        {
            cn=p[se];
            for(;cn!=NULL&&(se==cn->v1?cn->n1:cn->n2)!=tmp;)
            {
                cn=se==cn->v1?cn->n1:cn->n2;
            }
            if(cn==NULL)
            {
                p[se]=se==p[se]->v1?p[se]->n1:p[se]->n2;
            }
            else
            {
                if(cn->n1==tmp)
                {
                    cn->n1=(se==tmp->v1?tmp->n1:tmp->n2);
                }
                else
                {
                    cn->n2=(se==tmp->v1?tmp->n1:tmp->n2);
                }
            }
        }
        free(tmp);
        dfs(se);
    }
    return 1;
}

int main()
{
    while( scanf("%d",&n)&&n!=0 )
    {
        int i;
        gra tmp,sa;
        p=(gra*)calloc(n+1,sizeof(gra));
        assert(p);
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            tmp=(gra)calloc(1,sizeof(struct graph));
            assert(tmp);
            scanf("%d%d",&tmp->v1,&tmp->v2);
            if(tmp->v1>tmp->v2)
            {
                tmp->v1=tmp->v1^tmp->v2;
                tmp->v2=tmp->v1^tmp->v2;
                tmp->v1=tmp->v1^tmp->v2;
            }
            for(sa=p[tmp->v1]; sa!=NULL && sa->v2!=tmp->v2 ;sa=tmp->v1==sa->v1?sa->n1:sa->n2);
            if(sa!=NULL)
            {
                free(tmp);
            }
            else
            {
                tmp->n1=p[tmp->v1];
                p[tmp->v1]=tmp;
                tmp->n2=p[tmp->v2];
                p[tmp->v2]=tmp;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(tmp=p[i];tmp!=NULL && tmp->v1!=tmp->v2 ;tmp=i==tmp->v1?tmp->n1:tmp->n2);
            if(tmp==NULL)
            {
                tmp=(gra)calloc(1,sizeof(struct graph));
                assert(tmp);
                tmp->v1=tmp->v2=i;
                tmp->n2=tmp->n1=p[tmp->v1];
                p[i]=tmp;
            }
        }
        int cnt;
        gra tr;
        for(i=1,cnt=0;i<=n;i++)
        {
            cnt+=dfs(i);
        }
        printf("%d\n",cnt-1);
    }
    return 0;
}


相关文章

  • 2018-07-18-连通图&邻接多重表

    题目:HDOJ-1232 代码:(用邻接多重表求连通图个数)

  • 数据结构-学习二

    图: 无向图,有向图度,子图,路径,环,连通图,连通子图。 存储: 邻接矩阵二维数组。 邻接表+数组加链表优先搜...

  • 2020-09-09学习内容

    1.图的部分1.连通,连通分量,强连通2.图的存储方式2.1邻接矩阵法2.2邻接表,节点用顺序存。链表用链式去存,...

  • 面试准备之【数据结构】1——图

    一. 有向图/无向图 共有:邻接表,邻接矩阵 有向图独有:十字链表,边集数组 无向图独有:邻接多重表 1.邻接矩...

  • 数据结构-图

    数据结构 - 图 目录: 基本概念无向图有向图 储存结构邻接矩阵邻接表十字链表(有向图)邻接多重表(无向图) 图的...

  • 图的表示和存储结构

    图的表示:两种表示方法 邻接矩阵和邻接表 无向图 有向图 图的权 连通图 度 图的存储结构 1、邻接矩阵存储 浪...

  • 5 图的复习目录

    5.1 图 5.2 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重链表 5.3 图的遍历 深度优先 广...

  • 算法

    1.图的存储结构 邻接矩阵表示法 便于运算邻接表表示法 对于稀疏图来讲,更节省存储空间十字链表邻接多重表 ...

  • 数据结构(八):邻接表与邻接矩阵

    邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。 对于图 而言,其...

  • Java数据结构 - 图(邻接表存储)

    邻接表 相比邻接矩阵,邻接表要更加节省空间。 邻接表存储 本文将介绍邻接表存储有向带权图。图的例子如下。 介绍一下...

网友评论

      本文标题:2018-07-18-连通图&邻接多重表

      本文链接:https://www.haomeiwen.com/subject/rexapftx.html