poj3177 Redundant Paths

poj3177 Redundant Paths

题目大意:给一个连通图,求最少加多少边使它变成一个点联通分量。

先找割边,然后把没有桥的点双连通分量缩成一个连通分量。

这些连通分量按原来的关系连在一起就是一颗树。

把树变成一个点双联图图需要加(叶节点数+1)/2个边。

问题是怎么求点双连通分量。

如果一个点的dfn=low,说明目前栈中的元素都需要弹出,成为一个点双连通分量。

把他们记录到结构体里面就好了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <stack>
#define in(a) a=read()
#define MAXN 10010
#define REP(i,k,n)  for(int i=k;i<=n;i++)
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')
            f=-1;
    for(;isdigit(ch);ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
int n,m,ans;
int total=0,head[MAXN],nxt[MAXN<<1],to[MAXN<<1];//ÁÚ½Ó±í 
int ind,dfn[MAXN],low[MAXN],vis[MAXN<<1];//¸î±ß 
int num,bel[MAXN];//Ëõµã 
int du[MAXN];
stack <int> S;
inline void adl(int a,int b){
    total++;
    to[total]=b;
    nxt[total]=head[a];
    head[a]=total;
    return ;
}
inline void tarjan(int u){
    S.push(u);
    dfn[u]=low[u]=++ind;
    for(int e=head[u];e;e=nxt[e]){
        if(e%2 && vis[e+1])  continue;
        if(!(e%2) && vis[e-1])  continue; 
        if(vis[e])  continue;
        vis[e]=1;
        if(!dfn[to[e]]){
            tarjan(to[e]);
            low[u]=min(low[u],low[to[e]]);
        }
        else  low[u]=min(low[u],dfn[to[e]]);
    }
    if(low[u]==dfn[u]){
        num++;
        int v;
        do{
            v=S.top();
            bel[v]=num;
            S.pop();
        }while(u!=v);
    }
    return ;
}
int main(){
    in(n),in(m);
    int a,b;
    REP(i,1,m)  in(a),in(b),adl(a,b),adl(b,a);
    tarjan(1);
    REP(u,1,n)
        for(int e=head[u];e;e=nxt[e])
            if(bel[u]!=bel[to[e]])
                du[bel[u]]++,du[bel[to[e]]]++;
    REP(i,1,num)  if((du[i]/2)==1)  ans++;
    cout<<(ans+1)/2;
    return 0;
}

 

posted @ 2019-01-05 13:30 Dijkstra·Liu 阅读( ...) 评论( ...) 编辑 收藏
内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值