UVA - 12118 Inspector's Dilemma(检查员的难题)(欧拉回路)
题意:有一个n个点的无向完全图,找一条最短路(起点终点任意),使得该道路经过E条指定的边。
分析:
1、因为要使走过的路最短,所以每个指定的边最好只走一遍,所以是欧拉道路。
2、若当前连通的道路不是欧拉道路,最好的方法是通过加边使其成为欧拉道路。
3、若该图连通,则度数为奇数的点的个数只会是偶数个(连通图性质)。
4、欧拉道路只有两个度数为奇数的点,其他点度数均为偶数。
5、使一个连通图变为欧拉道路,只需要在所有度数为奇数的点之间加边,若一个连通图度数为奇数的点有x个,则需要加边(x - 2) / 2。
6、给定的边可能组成了几个连通图(并查集判断连通图个数),将各个连通图都变成欧拉道路后,再依次连接各欧拉道路,使整个图连通,依次连接各欧拉道路的加边数为欧拉道路总数-1。
7、最后便忘了加上指定的E条边的长度。
8、注意如果没有指定边,最短路长度为0。
#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {, };
const int dc[] = {, };
const int MOD = 1e9 + ;
const double pi = acos(-1.0);
const double eps = 1e-;
const int MAXN = + ;
const int MAXT = + ;
using namespace std;
int fa[MAXN];
int V, E, T;
int e[MAXN];
set<int> v[MAXN];//每个点的度数
set<int> cnt;
void init(){
for(int i = ; i <= V; ++i){
fa[i] = i;
v[i].clear();
}
memset(e, , sizeof e);
cnt.clear();
}
int Find(int v){
return fa[v] = (fa[v] == v) ? v : Find(fa[v]);
}
int solve(){
if(E == ) return ;//如果没有指定边,最短路长度为0
for(int i = ; i <= V; ++i){
int len = v[i].size();
if(len == ) continue;
int f = Find(i);
cnt.insert(f);
if(len & ){
++e[f];
}
}
int ans = ;
for(int i = ; i <= V; ++i){
if(e[i]){
ans += (e[i] - ) / ;
}
}
return (ans + (int)cnt.size() - + E) * T;
}
int main(){
int kase = ;
while(scanf("%d%d%d", &V, &E, &T) == ){
if(!V && !E && !T) return ;
init();
for(int i = ; i < E; ++i){
int x, y;
scanf("%d%d", &x, &y);
v[x].insert(y);
v[y].insert(x);
int tx = Find(x);
int ty = Find(y);
if(tx < ty) fa[ty] = tx;
else if(tx > ty) fa[tx] = ty;
}
printf("Case %d: %d\n", ++kase, solve());
}
return ;
}
UVA - 12118 Inspector's Dilemma(检查员的难题)(欧拉回路)的更多相关文章
- UVA 12118 Inspector's Dilemma(连通性,欧拉路径,构造)
只和连通分量以及度数有关.不同连通分量只要连一条边就够了,连通分量为0的时候要特判.一个连通分量只需看度数为奇的点的数量,两个端点(度数为奇)是必要的. 如果多了,奇点数也一定是2的倍数(一条边增加两 ...
- UVa 12118 nspector's Dilemma (构造+DFS+欧拉回路)
题意:给定n个点,e条边和每条边的长度t,每两个点之间都有路相连,让你求一条最短的路经过这e条边. 析:刚开始想到要判连通,然后把相应的几块加起来,但是,第二个样例就不过,后来一想,那么有欧拉回路的还 ...
- 【UVa】12118 Inspector's Dilemma(欧拉道路)
题目 题目 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...
- uva 701 - The Archeologists' Dilemma
题目链接:uva 701 - The Archeologists' Dilemma 题目大意:给出x,求一个e,使得x * 10 ^ y ≤ 2 ^ e < (x + 1) * 10 ^ y. ...
- UVa 12118 检查员的难题(dfs+欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
题意: 分析: 欧拉通路:图连通:图中只有0个或2个度为奇数的结点 这题我们只需要判断选择的边构成多少个联通块, 再记录全部联通块一共有多少个奇度顶点. 然后我们在联通块中连线, 每次连接两个联通块就 ...
- UVA 10026 Shoemaker's Problem 鞋匠的难题 贪心+排序
题意:鞋匠一口气接到了不少生意,但是做鞋需要时间,鞋匠只能一双一双地做,根据协议每笔生意如果拖延了要罚钱. 给出每笔生意需要的天数和每天的罚钱数,求出最小罚钱的排列顺序. 只要按罚款/天数去从大到小排 ...
- Inspector's Dilemma(欧拉通路)
In a country, there are a number of cities. Each pair of city is connected by a highway, bi-directio ...
- 6-14 Inspector s Dilemma uva12118(欧拉道路)
题意:给出一个国家城市个数n 所需走过道路个数e 每条道路长t 该国家任意两个城市之间都存在唯一道路长t 要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配 但是好 ...
随机推荐
- kd-tree理论以及在PCL 中的代码的实现(转载)
该文转自:https://www.cnblogs.com/li-yao7758258/p/6437440.html kd-tree理论以及在PCL 中的代码的实现 (小技巧记录:博客园编辑的网页界 ...
- nth-of-type()的用法
同样的标签选择其中一个,就用nth-of-type() <img src="http://cms-bucket.nosdn.127.net/2018/10/16/ad8698e497e ...
- 如何让浏览器的左上角显示自己的logo的小诀窍
很简单,只需要在head头部加上以下代码 <link rel="icon" href="图片路径" type="image/x-icon&quo ...
- SQL语言的四种类型
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHE ...
- Gcd&Exgcd
欧几里得算法: \[gcd(a,b)=gcd(b,a\bmod b)\] 证明: 显然(大雾) 扩展欧几里得及证明: 为解决一个形如 \[ax+by=c\] 的方程. 根据裴蜀定理,当且仅当 \[gc ...
- 车林通购车之家--购车计算器模块js实现
//jsq-nav.twig <ul class="switch-nav db-tags bgfff clearfix"> <li id="qk&quo ...
- 072、Java面向对象之定义构造方法
01.代码如下: package TIANPAN; class Book { // 定义一个新的类 public Book() { // 构造方法 System.out.println("* ...
- 嵊州普及Day3T1
题意:n座山,每天袭击k面,不能为同一座.问最少几天袭击所有山两面. 思路:不管如何,n,k<=10,做了就能过,考试时先想的暴力模拟,后来发现有规律,看看就好了. 见代码: #include& ...
- NOIP2017tg【逛公园】 题解
先说点别的 emmm--,这是本蒟蒻的第一篇题解,大佬们勿喷QwQ(要不是看到写题解可以加贡献,我才--) 可以看到标签,是2017年提高的题目,好像是Day1T3,感觉提高考这样的题目挺好的,至少考 ...
- oracle的存储过程和函数有什么区别?
Oracle中的函数与存储过程的区别: A:函数必须有返回值,而过程没有. B:函数可以单独执行.而过程必须通过execute执行. C:函数可以嵌入到SQL语句中执行.而过程不行. 其实我 ...