UVa12118

Inspector’s Dilemma

每两个城市之间都有道路连通,检查员要通过指定的道路,途中可以经过其它未指定的道路。通过每条道路的时间是一样的,求出通过所有指定道路要花费的最小时间。

如果指定的道路属于不同的连通子图,则检查员需要经由一条额外的道路来连接不同的连通子图,总共需要经由的额外道路是连通子图的数量减1。

下面再来考虑连通子图中需要添加额外道路的数量。假设从任意的城市出发,尽量不重复的通过了尽可能多的道路,如果此时还有未通过的指定道路,那么检查员可以经由一条未指定的道路直接到达该指定道路的起点,也可以重复通过指定道路到达该指定道路的起点,显然前者花费的时间是不大于后者的,所以最优解应该是只通过一次指定道路的,那么问题就变成了在无向连通子图中添加若干条边来构建一条欧拉通路。

无向连通图中存在欧拉通路的充分条件是奇度数的顶点个数为2。由于每条边贡献一个出度和一个入度,所以图中总度数一定为偶数,据此可以推出奇度数顶点数量为偶数,同时每添加一条边就能减少两个奇度数的顶点,所以需要添加边的条数为奇度数顶点个数减2。

#include <iostream>
#include <vector>using namespace std;class Solution
{public:Solution(const vector<vector<bool>>& graph, size_t E, size_t T) : graph(graph), visited(graph.size(), false), edges(E), time(T){CountSubgraph();for (const vector<size_t>& subgraph : subgraphs){size_t n = CountVertexWithOddDegree(subgraph);if (n > 2) edges += (n - 2) / 2;}edges += subgraphs.empty() ? 0 : subgraphs.size() - 1;time *= edges;}size_t TotalTraverseTime(){return time;}
private:vector<vector<bool>> graph;vector<bool> visited;vector<vector<size_t>> subgraphs;size_t edges, time;void CountSubgraph(){for (size_t i = 0; i < graph.size(); i++){if (!visited[i]) {visited[i] = true;subgraphs.push_back(vector<size_t>());subgraphs.back().push_back(i);dfs(i, subgraphs.back());if (subgraphs.back().size() == 1) {subgraphs.pop_back();}}}}void dfs(size_t curr, vector<size_t> &subgraph){for (size_t adj = 0; adj < graph[curr].size(); adj++){if (graph[curr][adj] && !visited[adj]) {visited[adj] = true;subgraph.push_back(adj);dfs(adj, subgraph);}}}size_t CountVertexWithOddDegree(const vector<size_t> &subgraph){size_t num = 0;for (size_t i : subgraph){size_t degree = 0;for (size_t j = 0; j < graph[i].size(); j++){if (graph[i][j]) degree++;}if (degree % 2 == 1) num++;}return num;}
};int main()
{int cases = 0;size_t V, E, T;while (cin >> V >> E >> T) {if (V == 0 && E == 0 && T == 0) break;vector<vector<bool>> graph(V, vector<bool>(V, false));size_t i, j;for (size_t e = 0; e < E; e++){cin >> i >> j;graph[i - 1][j - 1] = graph[j - 1][i - 1] = true;}Solution solution(graph, E, T);cout << "Case " << ++cases << ": " << solution.TotalTraverseTime() << endl;}
}
/*
5 3 1
1 2
1 3
4 5
4 4 1
1 2
1 4
2 3
3 4
0 0 0
*/

算法竞赛入门经典 习题6-14相关推荐

  1. 算法竞赛入门经典 习题3-2 分子量 Molar Mass

    给出一种物质的分子式(不带括号),求其分子量.本题分子式中只包含四种原子,分别为C.H.O.N,原子量分别为12.01,1.008,16.00,14.01.例如,C6H5OH的分子量为94.108g/ ...

  2. 算法竞赛入门经典|习题3-8, 循环小数(UVa202)

    耗时:1小时22分. 储备知识: 1.循环节 如果无限小数点后,从某一位起向右进行到某一位止的数字循环出现,首位衔接,则称这个小数为循环小数,这段数字为循环节. 例如: 547/7 = 78.(142 ...

  3. UVa 220 黑白棋 算法竞赛入门经典 习题4-3

    输出格式输出格式输出格式!UVaOJ的输出控制让我想起了玩黑魂时的感觉. 这道题难点在M操作后的输出 "Black - " 一眼看去'-'后面是两个个空格,然而事实是-与后面的数字 ...

  4. 算法竞赛入门经典 习题6-12

    UVa810 A Dicey Problem 一个迷宫里有一骰子,骰子可以上下左右移动的条件是相邻格中的数字和骰子朝上面的数字相同,或者相邻格子中为*.求一条从起点出发,最终回到起点的路径. 深搜和广 ...

  5. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

  6. 算法竞赛入门经典(第二版)第三章习题

    声明:作者水平有限,只是会基础C语言的小菜,C++还未入门.作者仅根据算法竞赛入门经典(第二版)书上第三章习题所述题意而编写,并未严格按照原题的输入输出编写,代码仅经过个人测试(OJ网站太慢了).代码 ...

  7. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  8. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  9. 刘汝佳《算法竞赛入门经典(第二版)》习题(二)

    刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...

最新文章

  1. 渐变显示渐变消失的BackgroundView
  2. HTTP自定义Header-(SOCKET-TCP)
  3. t490 指纹识别 linux,T490
  4. 查看sqlserver版本
  5. HttpURLConnection的警告
  6. php进入文件目录,php文件目录操作
  7. python避坑指南_Linux下Python3.6的安装及避坑指南
  8. 操作 mysql 不生成日志_利用Python操作MySQL数据库,以后不懂这些是要被鄙视的!...
  9. cte公用表表达式_在SQL Server中使用CTE进行插入和更新(公用表表达式)
  10. 奥哲徐平俊:乘风、冒险与未来
  11. 优化算法之——最速下降法
  12. 基于VB的员工请假管理系统设计与实现
  13. JVM 知识体系总结
  14. 使用shp裁剪县区遥感影像
  15. 密码算法测试向量——Cipher MAC SM4
  16. 不要把精力浪费在“吃瓜”上
  17. google退出中国声明原文【翻译版】
  18. 从1到N,第十二届中国IDC产业年度大典在京启幕
  19. LeetCode-题目详解(十一):回溯算法【递归回溯、迭代回溯】【DFS是一个劲往某一个方向搜索;回溯算法建立在DFS基础之上,在搜索过程中,达到结束/裁剪条件后,恢复状态,回溯上一层,再次搜索】
  20. java实现.费诺编码_香农费诺编码的matlab实现.doc

热门文章

  1. MySQL对数据表进行分组查询(GROUP BY)
  2. 微信 SHA1 签名_微信公众号自动回复功能开发
  3. ThinkPad T440s 改 T450s
  4. TCP 的那些事 | SACK
  5. echarts自定义区域地图
  6. 拖拽删除元素、拖拽排序、拖拽预览图片和拖拽移动元素
  7. 【Java基础】(八)方法(即C等语言中的函数)
  8. 手摸手带你学移动端WEB开发
  9. 手把手教你开发基于深度学习的人脸识别【考勤/签到】系统
  10. 多数互联网人对2021年终奖不抱期待