习题6-14 检查员的难题 UVa12118
来源:互联网 发布:商城类app源码 编辑:程序博客网 时间:2024/05/16 18:43
1.题目描述:点击打开链接
2.解题思路:本题利用DFS和欧拉道路解决。本题其实要求找一些路径,使得和要求经过的那些路径能够组成欧拉道路(注意不是欧拉回路,“欧拉道路”是指除了起点和终点外,路径上的其他点的入度等于出度的道路)。首先用dfs来判断连通性,这里用dfs还有另外一个原因就是要统计度数为奇数的点的个数,因为这样的点都需要额外添加一条道路使其度数变为偶数,符合欧拉道路的要求。由于添加一条路径后会使得两个端点的度数同时变为2,而且起点和终点的度数均要为奇数,所以统计完后还要减去2,因此最后的路径总数是E+(res-2)/2。其中(res-2)/2就是最后又添加上的路径数目。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;#define N 1000+10int V, E, T;vector<int>Road[N];int vis[N];void init(){memset(vis, 0, sizeof(vis));for (int i = 0; i < N; i++)Road[i].clear();}int dfs(int n){if (vis[n])return 0;int cnt = 0;vis[n] = 1;cnt += (Road[n].size() & 1);//统计度数为奇数的点for (int i = 0; i < Road[n].size(); i++)cnt += dfs(Road[n][i]);return cnt;}int solve(){int res = 0;for (int i = 1; i <= V;i++)if (!vis[i] && !Road[i].empty())//注意一定要防止重复累加!res += max(dfs(i), 2);//统计所有度数为奇数的点的个数return T*(max((res - 2) / 2, 0) + E);//最终的答案是E加上新增加的路径数目(res-2)/2}int main(){//freopen("t.txt", "r", stdin);int rnd = 0;while (init(), cin >> V >> E >> T, V || E || T){int x, y;for (int i = 0; i < E; i++){scanf("%d%d", &x, &y);Road[x].push_back(y);Road[y].push_back(x);}printf("Case %d: %d\n", ++rnd, solve());}return 0;}
0 0
- 习题6-14 检查员的难题 UVa12118
- 习题6-14 检查员的难题(Inspector's Dilemma, ACM/ICPC Dhaka 2007, UVa12118)
- uva12118
- UVA12118
- uva12118(不用dfs的方法!)
- 习题 6-14 UVA - 12118 Inspector's Dilemma 检察员的难题 (DFS 构造欧拉通路)
- 习题6-12 筛子难题 UVa810
- [刷题]算法竞赛入门经典(第2版) 6-14UVa12118
- 习题6-12 筛子难题(A Dicey Problem, ACM/ICPC World Finals 1999, UVa810)
- UVa12118:Inspector's Dilemma
- python核心编程6-14习题的解题思路
- 现在的难题
- 需求的难题
- 海盗的难题
- ASP最大的难题...
- Java面试的难题
- star55的难题
- 微软的面试难题
- c++基础概念<二>
- android英文词汇表
- 图解Ubuntu14.04 VPN PPTP 简单配置连接
- 使用SVG中的Symbol元素制作Icon
- 1. 浅谈设计模式
- 习题6-14 检查员的难题 UVa12118
- 在Mac下启动和停止MySQL
- RHEL/CentOS7/Fedora21挂载NTFS报错问题
- VS2005-此计算机下已安装了试用版,必须先卸载以前安装的试用版后才能安装另一个试用版
- VS2005-此计算机上已安装了试用版。必须先卸载以前安装的试用版后才能安装另一个试用版
- shell基础记录
- 输出杨辉三角(C++和 JAVA版 )
- 当VS2005卸载不干净时
- BFS+优先队列 处理走迷宫类问题