POJ 3352 Road Construction 双联通分量 难度:1

http://poj.org/problem?id=3352

有重边的话重边就不被包含在双连通里了

割点不一定连着割边,因为这个图不一定是点连通,所以可能出现反而多增加了双连通分量数的可能

必须要用割边的思路来看

#include <cstdio>
#include <vector >
using namespace std;
const int maxn=1001;
vector<int >G[maxn];

int low[maxn],dfn[maxn];
bool vis[maxn];

int dg[maxn];

int  dep,cnt;
void dfs(int s,int f){
    low[s]=dfn[s]=++dep;
    vis[s]=true;
    for(int i=0;i<G[s].size();i++){
        int t=G[s][i];
        if(t==f)continue;
        if(!vis[t]){
            dfs(t,s);
            low[s]=min(low[s],low[t]);
        }
        else low[s]=min(low[s],dfn[t]);
    }
}
int n,r;
int main(){
    scanf("%d%d",&n,&r);
    int f,t;
    while(r--){scanf("%d%d",&f,&t);G[f].push_back(t);G[t].push_back(f);}
    dfs(1,-1);

    for(int i=1;i<=n;i++){
        for(int j=0;j<G[i].size();j++){
            if(low[i]!=low[G[i][j]])dg[low[i]]++;
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(dg[i]==1)ans++;
    }
    ans=(ans+1)/2;
    printf("%d\n",ans);
    return 0;
}

  

 

转载于:https://www.cnblogs.com/xuesu/p/3917832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值