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 ...
随机推荐
- 【转】Oracle中的decode在mysql中的等价实现
以前用的Oracle,里面的Decode函数非常好用,那MySql实现同样的功能用什么呢?——MySql使用if的语法来支持. 格式:IF(expr1,expr2,expr3)如果expr1是TRUE ...
- sql储存过程in(多个参数)
一.用sql函数 首先要创建一个截取字符串的函数,新建一个查询,把下面代码复制进去执行. 函数SqlitIn的第一个参数是储存过程要in的字符串,第二个参数是分隔符 CREATE function S ...
- Apache Spark 2.2中基于成本的优化器(CBO)(转载)
Apache Spark 2.2最近引入了高级的基于成本的优化器框架用于收集并均衡不同的列数据的统计工作 (例如., 基(cardinality).唯一值的数量.空值.最大最小值.平均/最大长度,等等 ...
- C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...
- elaticsear no [query] registered for [filtered] 错误
1.问题描述 执行语句: GET /megacorp/employee/_search { "query" : { "filtered" : { "f ...
- Python基础(下)
前言 print("\n".join([''.join(['*'*((x-y)%3) if((x*0.05)**2+(y*0.1)**2 -1)**3-(x*0.05)**2*(y ...
- JVM规范系列第3章:为Java虚拟机编译
Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编 ...
- Session之Config配置
<sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" ...
- LInux下设置账号有效时间 以及 修改用户名(同时修改用户组名和家目录)
在linux系统中,默认创建的用户的有效期限都是永久的,但有时候,我们需要对某些用户的有效期限做个限定!比如:公司给客户开的ftp账号,用于客户下载新闻稿件的.这个账号是有时间限制的,因为是付费的.合 ...
- Websocket(一)——原理及基本属性和方法
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起. 举例 ...