POJ P3352 Road Construction 解题报告
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 解题报告的更多相关文章
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
- 【原创】poj ----- 2376 Cleaning Shifts 解题报告
题目地址: http://poj.org/problem?id=2376 题目内容: Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K ...
- 【原创】poj ----- 1611 The Suspects 解题报告
题目地址: http://poj.org/problem?id=1611 题目内容: The Suspects Time Limit: 1000MS Memory Limit: 20000K To ...
- 【原创】poj ----- 2524 Ubiquitous Religions 解题报告
题目地址: http://poj.org/problem?id=2524 题目内容: Ubiquitous Religions Time Limit: 5000MS Memory Limit: 6 ...
- 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 ...
- [POJ 1002] 487-3279 C++解题报告
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 228365 Accepted: 39826 D ...
随机推荐
- python 的zip 函数小例子
In [57]: name = ('Tome','Rick','Stephon') In [58]: age = (45,23,55) In [59]: for a,n in zip (name,ag ...
- Scala学习(五)---Scala中的类
Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...
- Linux Shell完成Qt程序的自动部署
#!/bin/sh #取当前脚本的绝对路径 srcDir=$(cd ")";pwd) #设置库所在路径 libDir=${srcDir}"/J1900RunLib/*&q ...
- Verilog设计异步FIFO
转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...
- [Socket]Socket聊天小程序
一个简单是Socket聊天小程序,读写操作在不同的线程中.服务器端采用线程池. 1.Server import java.io.IOException; import java.net.ServerS ...
- LVM常规操作记录梳理(扩容/缩容/快照等)
基本介绍Linux用户安装Linux 操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间.随着 Linux的逻辑盘卷管理功能的出现,这些问题都迎刃而解, l ...
- 团队作业 week 14
0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...
- 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现
基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...
- vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法
vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法 在vue 里面<style scoped></style> 是为了让样式只影响本身自己组件的样式,不改变全 ...
- JavaScript的类、对象、原型、继承、引用
以CSS为例,有一种为所有class为"xxxx"的元素添加样式(外联样式),那么所有class为xxx的元素样式就会改变,在css中像下面这么写: <html> &l ...