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

你可能感兴趣的文章
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Vue3+Element-ul学生管理系统(第二十二课)
查看>>
Node-RED中怎样让网站返回JSON数据
查看>>
Node-RED中根据HTML文件建立Web网站
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED简介与Windows上安装、启动和运行示例
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>
node-request模块
查看>>
node-static 任意文件读取漏洞复现(CVE-2023-26111)
查看>>
Node.js 8 中的 util.promisify的详解
查看>>
node.js debug在webstrom工具
查看>>
Node.js Event emitter 详解( 示例代码 )
查看>>
Node.js GET、POST 请求是怎样的?
查看>>