博客
关于我
POJ--3352 道路建设
阅读量:188 次
发布时间:2019-02-28

本文共 1871 字,大约阅读时间需要 6 分钟。

POJ–3352 道路建设

题目描述

在这里插入图片描述

输入样例1

10 121 21 31 42 52 65 63 73 87 84 94 109 10

输出样例1

2

输入样例2

3 31 22 31 3

输出样例2

0

题意分析:

题目中的景点相当于图中的点,道路相当于路径,当修一条路时候两个景点无法旅行,所以我们要通过修路来解决这个问题,让即使去掉一条边当前图依旧连通.也就是求在图中添加多少条边从而可以去掉任意边都依旧连通…

易知图中,边双连通分量之间,去掉任意一条边该连通分量依旧是连通的,所以可以求出连通图中边双连通分量的个数,然后缩点.最后统计叶子节点的个数,通过叶子结点获得应该增加多少条边.

解题步骤

如果结点在一个边双连通分量中,则不需要添加边。而连通分量之间需要添加边,因此需要求解连通分量。

  1. 样例1中,可求得边连通分量共有4个.样例2中双联通分量只有一个(所以需要添加0条边).

在这里插入图片描述

在这里插入图片描述

2.将每个双连通分量缩成点.

在这里插入图片描述
2. 需要的添加的新路数量,先计算度为1的点数k,则至少添加(k+1)/2边。例如,3个度为1的顶点,需要加两条边,4个度为1的顶点也需要加两条边。因为对于奇数个叶子节点,每两个需要一条边来构成双连通分量.也就是需要(k+1) / 2条边.如果偶数个点.则需要 k /2. 易知 k+1 / 2 与k/2值是一样的.所以都用k+1/2即可
在这里插入图片描述

算法设计

在这里插入图片描述

参考代码

#include
#include
using namespace std;const int maxn = 1000 + 5;int n, m;int head[maxn], cnt;struct Edge{ int to, next;}e[maxn << 1];int low[maxn], dfn[maxn], degree[maxn], num;void add(int u, int v){ e[++cnt].next = head[u]; e[cnt].to = v; head[u] = cnt;}void tarjan(int u, int fa)//使用tarjan算法求出每个节点的low和dfn值{ dfn[u] = low[u] = ++num; for (int i = head[u]; i; i = e[i].next) { int v = e[i].to; if (v == fa) continue; if (!dfn[v]) { tarjan(v, u); low[u] = min(low[u], low[v]);//注:如果是求割点或割边则下边就开始进行判断. } else low[u] = min(low[u], dfn[v]); }}void init(){ memset(head, 0, sizeof(head)); memset(low, 0, sizeof(low)); memset(dfn, 0, sizeof(dfn)); memset(degree, 0, sizeof(degree)); cnt = num = 0;}int main(){ while (cin >> n >> m) { init(); int u, v; while (m--) { cin >> u >> v; add(u, v); add(v, u); } tarjan(1, 0); for (int u = 1; u <= n; u++) { for (int i = head[u]; i; i = e[i].next) { int v = e[i].to; if (low[u] != low[v])//对于每个连通分量命个名(以low命名)然后进行缩点, { degree[low[u]]++;//缩点 } } } int leaf = 0; for (int i = 1; i <= n; i++)//统计节点度数为1的个数 { if (degree[i] == 1) { leaf++; } } cout << (leaf + 1) / 2 << endl; } return 0;}

题目考点

1.tarjan算法的使用

2.对于双连接图的理解.

转载地址:http://aufj.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>