当前位置: 首页 > news >正文

POJ-3352 Road Construction(边双连通分量+缩点)

题意:

n个旅游景点,r条路连接,无向图,现要维护每一条现有的道路,但维护当前road时需保证n个顶点仍然相互可达,问要保证上述条件,需新建几条road。即求一个无向图中需添加几条边,使之成为边双连通图。

思路:

通过tarjan求出边双连通分量,然后将每一个边双连通分量缩成一个点,将无向图最终会缩成一棵树,一棵所有边为原无向图中割边的树。

= =然后又要用到一个须知的结论:若要使得任意一棵树,在增加若干条边后,变成一个双连通图,那么至少增加的边数 =(这棵树中度数为1的结点数 + 1)/ 2。

在求构造树节点的度数貌似很麻烦。但不然,因为原图在tarjan之后所有相同low值的节点必定在同一个边双连通分量中,所以我们只需要枚举原图中直接连通的两点,如果不在同一个边双连通分量中,就将它们各自所在缩点的度数+1。注意是无向图,所有缩点的度数都会是真实度数的2倍,所以除2再判断就好。


//时隔仨月,做题终于做出这模板的bug了,tarjan之后所有相同low值的节点必定在同一个边双连通分量中这句话是对,但是low值不相同的也有可能是可能属于同一个边双连通分量的,代码已更。


代码:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <cstdio>
#include <map>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
struct node
{
    int u, v, next;
}edge[maxn*2];
int no, head[maxn];
int dfn[maxn], low[maxn];
int top, S[maxn];
int bccno[maxn], bcc_cnt;
int idx;
map<int, int> mp;
map<int, int>::iterator it;
void init()
{
    no = 0; idx = 0; bcc_cnt = 0;
    memset(head, -1, sizeof head);
    memset(dfn, 0, sizeof dfn);
    memset(bccno, 0, sizeof bccno);
}
inline void add(int u, int v)
{
    edge[no].u = u; edge[no].v = v;
    edge[no].next = head[u]; head[u] = no++;
}
void tarjan(int u, int fa)
{
    dfn[u] = low[u] = ++idx;
    S[++top] = u;
    for(int k = head[u]; k+1; k = edge[k].next)
    {
        int v = edge[k].v;
        if(!dfn[v])
        {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
        }
        else if(v != fa)
        {
            low[u] = min(low[u], dfn[v]);
        }
    }
    if(dfn[u] == low[u])
    {
        ++bcc_cnt;
        do
        {
            bccno[S[top]] = bcc_cnt;
            --top;
        }
        while(S[top+1] != u);
    }
}
int SuoDian()
{
    mp.clear();
    int ans = 0;
    for(int i = 0; i < no; ++i)
    {
        int u = edge[i].u, v = edge[i].v;
        if(bccno[u] != bccno[v]) ++mp[bccno[u]], ++mp[bccno[v]];
    }
    for(it = mp.begin(); it != mp.end(); ++it)
    if(it->second/2 == 1) ++ans;
    return (ans+1)/2;
}
int main()
{
    int n, r, u, v, maxx;
    while(~scanf("%d %d", &n, &r))
    {
        init();
        for(int i = 1; i <= r; ++i)
        {
            scanf("%d %d", &u, &v);
            add(u, v); add(v, u);
        }
        tarjan(1, -1);
        printf("%d\n", SuoDian());
    }
    return 0;
}


继续加油~

相关文章:

  • 445port入侵详细解释
  • UVALive-5013 Similarity(二分图最大权匹配)
  • Cisco ASA-ASA 8.2-L2L ***
  • HDU-3440 House Man(差分约束系统)
  • 怎么安装docker registry
  • HDU-3666 THE MATRIX PROBLEM(差分约束系统判断存在与否+特殊剪枝)
  • Thinkphp学习04
  • HDU-4315 Climbing the Hill(阶梯博弈变形)
  • HDU-5724 Chess(SG函数+状压)
  • Randy Shoup与Andrew Phillips对微服务方面问题的解答
  • HDU-4109 Instrction Arrangement(差分约束系统+增加源点技巧)
  • WiFi覆盖下的生活 享受便利的同时 别忘记了安全
  • HDU-6103 Kirinriki - 2017 Multi-University Training Contest - Team 6(尺取)
  • centos 记录用户行为轨迹
  • 使用时间戳解决浏览器缓存问题
  • hexo+github搭建个人博客
  • [译]前端离线指南(上)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • echarts花样作死的坑
  • javascript从右向左截取指定位数字符的3种方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 如何进阶一名有竞争力的程序员?
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 运行时添加log4j2的appender
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #预处理和函数的对比以及条件编译
  • (AngularJS)Angular 控制器之间通信初探
  • (LeetCode C++)盛最多水的容器
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二开)Flink 修改源码拓展 SQL 语法
  • (四)JPA - JQPL 实现增删改查
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)VirtualBox安装增强功能
  • (转)详解PHP处理密码的几种方式
  • ./configure,make,make install的作用
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net core 6.0 升8.0
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Core和.Net Standard直观理解
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Micro Framework初体验(二)