博客
关于我
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/

你可能感兴趣的文章
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySQL 高性能优化规范建议
查看>>