[思考]无向连通图的个数

做了一些连通图的专题,发现在题目中的特殊情况下需要判断当前连通图是一个还是多个,而既然提出了这个问题,就说明在有的问题中需要考虑这种情况。

拿HDU4738为例,这道题中,如果是给定边组成了一个连通图的话输出为-1,反之再进行其他的判断。

因为是需要求桥,所以在直接使用Tarjan算法了。

使用Tarjan算法的时候会有这样一个思考,题中有没有说给定的边构成一个图,如果是的话,你有没有直接写成Tarjan(1,0)这样的调用?如果不是的话就要加一个for循环了,但是加这个for循环的时候需要进行一个特判:

 for(int i=1;i<=N;++i)
    if(!DFN[i])
    {
        Tarjan(i,i);
        ++num;
    }


当然,还可以使用并查集的方法,判断输入的两个点是否属于不同的集合,如果属于不同的集合就把他们合并起来,进行操作的地方是加边的时候:
 

for(int i=1; i<=m; ++i)
{
    scanf("%d%d%d",&u,&v,&w);
    if(u==v) continue;
    addedge(u,v,w);
    addedge(v,u,w);
    bing(u,v)
}

因为是判断是否有多个连通图,只要存在两个或者两个以上就代表存在多个,所以我们找到并查集关系之后,只需要从1到n进行遍历当前的值是否与1不属于同一个连通图,如果是的话就代表存在多个连通图。

for(int i=1;i<=n;++i)
{
    if(find(i)!=find(1))
    {
        flag=true;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值