P3352 Road Construction

描述

这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路。

道路本身也很有趣。由于岛上奇特的风俗习惯,道路的布置使得它们不会在十字路口相遇,而是通过桥梁和隧道在彼此之间穿过或穿过。这样,每条道路都在两个特定的旅游景点之间运行,这样游客不会失去不可挽回的收入。

不幸的是,鉴于每条道路上所需的维修和升级的性质,当建筑公司在特定的道路上工作时,它在任何方向都不可用。如果不能在两个旅游景点之间旅行,即使建筑公司在任何特定时间只在一条道路上工作,这也可能导致问题。

因此,偏远岛道路部已决定请求您的咨询服务来帮助解决这个问题。已经决定在各个景点之间建造新的道路,使得在最终配置中,如果任何一条道路正在建设中,则仍有可能使用剩余道路在任何两个旅游景点之间旅行。你的任务是找到必要的最少数量的新道路。

输入

第一行输入由正整数\(n\)和\(r\)组成,用空格隔开,其中\(3≤n≤1000\)是岛上旅游景点的数量,\(2≤r≤1000\)是道路数量。旅游景点可方便地标记为1至\(n\)。下列\(r\)行中的每一行都由两个整数组成,\(v\)和\(w\)之间用空格隔开,表示标记为\(v\)和\(w\)的景点之间存在道路。请注意,您可以沿着每条道路向两个方向行驶,任何一对旅游景点最多只能有一条道路在它们之间。此外,您可以放心,在目前的配置中,可以在任何两个旅游景点之间旅行。

输出

一行,由一个整数组成,它给出我们需要添加的最少道路数量。


谷歌翻译的。海星。

题目简化:对于一个联通图,加最少的边使图成为一个边双联通图。

可以看出,对于环上的任何一条边,割去都是没有影响的,我们可以先缩点,将图缩成一个树。然后对树做讨论。

对树中度为1的点,我们一定要把这个点再连一个边,此时用贪心的思想,同样使它连接其他度为1的点。对于度不为1的点,我们割去任何一条与它相连的边后它都可以通过度为1的点新连得边跑走。所以答案为\(\lceil d/2 \rceil\)。

在做法上,也可以不缩点做,甚至是思想上。

在题目HNOI2012 矿场搭建中,我们用了这样的思想。

讨论每一个联通块中由割点相连接的若干个强连通分量(等效为去掉割点),讨论这个强连通分量与多少个割点相连做出决策。

对于这个题,我们可以考虑与割边相连的环。

若一个环与一个割边相连,则割去这个边后不能与其他的联通,得连走一条,等效为缩点后度为1的点。

若一个环与多个割边相连,无所谓啊。

【拓展】由此我们也可以由割边在无向图找环了。

这样写起来也比较简单了。


code:

#include <cstdio>
int min(int x,int y){return x<y?x:y;}
const int N=1010;
struct Edge
{
int to,next;
}edge[N<<1];
int head[N],cnt=1,cntt=0,n,m;
void add(int u,int v)
{
edge[++cnt].next=head[u];edge[cnt].to=v;head[u]=cnt;
}
int time=0,low[N],dfn[N],ans=0,c[N],is[N],used[N];
void tarjan(int now,int fa)
{
low[now]=dfn[now]=++time;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v,now);
low[now]=min(low[v],low[now]);
if(low[v]>dfn[now])
is[i]=1,is[i^1]=1;
}
else if(fa!=v)
low[now]=min(low[now],dfn[v]);
}
}
void dfs(int now)
{
used[now]=1;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(is[i])
cntt++;
else if(!used[v])
dfs(v);
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++)
tarjan(i,0);
for(int i=1;i<=n;i++)
if(!used[i])
{
cntt=0;
dfs(i);
if(cntt==1) ans++;
}
printf("%d\n",ans+1>>1);
return 0;
}

2018.6.9

POJ P3352 Road Construction 解题报告的更多相关文章

  1. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

     http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...

  2. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  3. POJ 3126 Prime Path 解题报告(BFS & 双向BFS)

    题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...

  4. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  5. 【原创】poj ----- 2376 Cleaning Shifts 解题报告

    题目地址: http://poj.org/problem?id=2376 题目内容: Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K ...

  6. 【原创】poj ----- 1611 The Suspects 解题报告

    题目地址: http://poj.org/problem?id=1611 题目内容: The Suspects Time Limit: 1000MS   Memory Limit: 20000K To ...

  7. 【原创】poj ----- 2524 Ubiquitous Religions 解题报告

    题目地址: http://poj.org/problem?id=2524 题目内容: Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 6 ...

  8. POJ 3177 Redundant Paths & POJ 3352 Road Construction(双连通分量)

    Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...

  9. [POJ 1002] 487-3279 C++解题报告

        487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 228365   Accepted: 39826 D ...

随机推荐

  1. [译]通往 Java 函数式编程的捷径

    原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 ...

  2. cgroup.conf系统初始配置

    # Slurm cgroup support configuration file # # See man slurm.conf and man cgroup.conf for further # i ...

  3. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

    为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效率. 本系 ...

  4. 团队作业Week14——源代码管理

    0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...

  5. Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程

    实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vm ...

  6. Android 學習之旅!(2)

    早幾天因爲學車,弄了幾天時間和精力過去,今天終於考過了(科目二,還是補考的...)嗯..不管這麼多了..今天又開始我的android 學習之旅!! 筆記: platform-tools目錄下的文件: ...

  7. Python学习笔记(一)——初学Python

    1.Python环境配置 本人配置Python2.7及Python3.6版本 将Python3.6环境配置在线,因此默认为Python3.6版本 Python2.7及Python3.6共存 2.简单操 ...

  8. 最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来

    package com.example.home; import java.io.IOException; import java.io.InputStream; import javax.micro ...

  9. 小学四则运算APP 最后阶段

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 这次发布的是我们APP的最终版本!图片背景有根据用户需求改变!还增加了草稿纸运算的画布功能! 运行结果如下: package com.ex ...

  10. SQLserver 进程被死锁问题解决

    事务(进程ID xx)与另一个进程被死锁在 锁|通信缓冲区 资源上,并且已被选座死锁牺牲品.请重新运行该事务.Sqlserver 当出现这个错误时,如下图: 解决办法:更改数据库事务隔离级别 alte ...