习题6-14 检查员的难题 UVa12118

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+10
int 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;
}
时间: 2024-12-29 23:08:00

习题6-14 检查员的难题 UVa12118的相关文章

C++ Primer(第四版) 课后习题3.14

问题: 读入一段文本到 vector 对象,每个单词存储为 vector  中的一个元素.把 vector对象中 每个单词转化为大写字母.输出 vector 对象中转化 后的元素,每 8 个词为一行输出. 代码: 1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int main() 7 { 8 cout<<"输入一段文本(Ctrl + Z 结束):"<

[詹兴致矩阵论习题参考解答]习题1.14

14. 如果映射 $f:M_n\to M_n$ 按某个固定的模式将 $M_n$ 中的每个矩阵的元素重排, 则称 $f$ 为一个置换算子. 怎样的置换算子保持矩阵的特征值不变? 保持秩不变? 解答: 置换算子 $f$ 保持矩阵的特征值不变当且仅当存在置换矩阵 $P$, 使得 $$\bex f(A)=PAP^T,\quad \forall\ A\in M_n; \eex$$ 或 $$\bex f(A)=PA^TP^T,\quad \forall\ A\in M_n. \eex$$ 置换算子 $f$

[詹兴致矩阵论习题参考解答]习题3.14

14. 用 Hadamard 不等式 (3.5) 证明下面的不等式 (也称为 Hadamard 不等式): 设 $A=(a_1,\cdots,a_n)\in M_n$, 则 $$\bex |\det A|\leq \prod_{i=1}^n \sen{a_i}, \eex$$ 其中 $\sen{\cdot}$ 表示列向量的欧氏范数. 证明: 既然 $$\bex A^*A=\sex{\ba{ccc} a_1^*\\ \vdots\\ a_n^* \ea}\sex{\ba{ccc} a_1&\cdo

[詹兴致矩阵论习题参考解答]习题4.14

14. 设 $A,B\in M_n$, 则对 $M_n$ 上的任何酉不变范数有 $$\bex \frac{1}{2}\sen{\sex{\ba{cc} A+B&0\\ 0&A+B \ea}}\leq \sen{\sex{\ba{cc} A&0\\ 0&B \ea}} \leq \sen{\sex{\ba{cc} |A|+|B|&0\\ 0&0 \ea}}. \eex$$ 证明: (1). 由 $$\bex \sex{\ba{cc} 0&I\\ I&a

数据结构与算法分析(C语言描述)习题2.14

问题描述:Eratosthenes筛是一种用于计算小于N的所有素数的方法.我们从制作整数2到N的表开始.我们找出最小的未被删除的整数i,打印i,然后删除i, 2i, 3i, ..., 当i > √N时,算法终止. 首先,没必要做2到N的表,在一个循环内遍历2到N即可. 其次,所谓最小也没必要判断,依次遍历时整数i自然是它到最后一个数之间的最小值. 最后,整数i是否被删除等价于整数i是否素数flag[i]==1或0表示,1表示素数,0表示非素数. 可以这么做: 遍历2到N的整数i,如果它是素数,打

SQL表操作习题4 14~25题 缺20题

武汉科技大学ACM :1008: 华科版C语言程序设计教程(第二版)习题6.14

Problem Description 输入一个八进制的字符串,将它转换成等价的十进制字符串,用pringf的%s格式输出. Input 首先输入一个正整数t,表示有t组测试数据(1<= t <= 10010). 接下来t行,每行一个字符串,表示一个八进制整数(这个整数不超过20位). Output 对于每个测试数据,输出相应的十进制字符串.每个字符串一行. Sample Input 1 1732 Sample Output 986 HINT 注意:给的八进制数可能很大,用long long

C++ Primer第四版习题--3.14

/*读入一段文本到vector对象,每个单词存储为vector中的一个元素, * 把vector中的每个单词转化为大写字母. * 输出转化后的元素,每8个单词为一行 **/ #include <iostream> #include <vector> #include <string> #include <cctype> int main() { std::vector<std::string> svec; std::string word; wh

SICP 习题 (2.14)解题总结:区间误差导致的问题

SICP 习题 2.14 的题目要求并没有完全体现在题干中,这道题是和书中前面的内容相关的. 书中讲到,Alyssa做完了我们以前讨论的区间计算模块并发布出去了,然而,一段时间以后她接受到了来自一个叫做Lem的工程师的抱怨,这个叫做Lem的人应该是搞电路的,他用Alyssa的程序去计算两个电阻的并联电阻值,里面就使用了Alyssa设计的区间来表示一个电阻的电阻值.按照物理上的定律,并联电阻的公式是(R1*R2)/ (R1 + R2),或者使用1/(1/R1 + 1/R2),这两个公式不管从数学上