UVA-12118 Inspector's Dilemma

欧拉回路+dfs
任意两点之间都有连通,要输出经过所有给出的边的最小时间
要使经过所有所给边的时间最小,一定不会将一个边走过两次,这样就变成
了构造一个欧拉道路的问题,输入也许有多个连通块,所以每个连通块都要
构造成一个欧拉道路(回路),通过度数统计需要增加的边,再加上连接不同
连通快的边,再加上所给出的边就是答案。
跑了500多ms,挺长的,个人感觉是因为样例中有大量的稀疏图,邻接矩阵浪费了大量时间,改成邻接表
应该会快点。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<set>
 5 #define inf 0x7f7f7f7f
 6 #define mem(a) memset(a,0,sizeof(a))
 7 #define rep(i,n) for(int i=0;i<n;i++)
 8 using namespace std;
 9 const int maxn = 1010;
10 int G[maxn][maxn];
11 int vis[maxn];
12 int v,e,t;
13 int ans; int degree[maxn];
14 int dfs(int n){
15     for(int i=1;i<=v;i++){
16         if(G[n][i]){
17             degree[n]++;
18             degree[i]++;
19             G[n][i]=G[i][n]=0;
20             ans++;//printf("%d\n",ans);
21             dfs(i);
22         }
23     }
24 }
25 int main()
26 {
27     int cases=1;
28     while(scanf("%d%d%d", &v, &e, &t) == 3 && v){
29         mem(G); mem(vis);
30         int uu,vv;
31         rep(i,e){
32             scanf("%d%d", &uu, &vv);
33             G[uu][vv] = G[vv][uu] = 1;
34         }
35         ans=0;
36         for(int i=1;i<=v;i++){
37             for(int j=1;j<=v;j++){
38                 if(G[i][j]){
39                     ans++;
40                     mem(degree);///补全有两种方案,第一种度数全部补成偶数,第二种保留两个奇点
41                     dfs(i);
42                     int p1=0;
43                     for(int i=1;i<=v;i++){
44                         if(degree[i]%2==1) p1++;
45                         //printf("%d ",degree[i]);
46                     }
47                     //printf("\n");
48                     if(p1>=2) p1-=2;
49                     ans+=p1/2;
50                     //printf("%d\n",p1);
51                 }
52             }
53         }
54         if(ans) ans--;//连接连通快的边等于连通快数减一
55         printf("Case %d: %d\n",cases++,ans*t);
56     }
57     return 0;
58 }

UVA-12118 Inspector's Dilemma

时间: 2024-10-15 14:16:17

UVA-12118 Inspector's Dilemma的相关文章

【UVa】12118 Inspector&#39;s Dilemma(欧拉道路)

题目 题目 ? ? 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, 为什么呢?题目要求最短距离,那么必定是欧拉道路,那么为了构造出最短欧拉道路,要将奇度数的点减小至2个,然而各个道路不一定联通,还需要计算一下联通块数量n,结果加上n-1后,再乘t,因为需要n-1条边将各个联通块连接起来. 注意题目已保证每两个点都有路,所以上面才能那么肆无忌惮的连边. ? ? 代码

UVa 12118 nspector&#39;s Dilemma (构造+DFS+欧拉回路)

题意:给定n个点,e条边和每条边的长度t,每两个点之间都有路相连,让你求一条最短的路经过这e条边. 析:刚开始想到要判连通,然后把相应的几块加起来,但是,第二个样例就不过,后来一想,那么有欧拉回路的还得加1啊. 又想每次再判一次是不是欧拉回路,怎么判又是问题,因为并不知道哪些是连在一块的,还得再查找,麻烦啊.... 后来上网看了一下题解,原来是要构造啊,也就是说把每个连通块都构造成一个欧拉回路,那么再减去端点的,就能完全连通了. 真是好方法,欧拉回路满足每个点的度都是偶数,也就是说如果不是偶数那

UVa12118 Inspector&#39;s Dilemma (欧拉路径)

链接:http://acm.hust.edu.cn/vjudge/problem/38518分析:无向图计算欧拉路径.注意:构造的对象是欧拉路径,不是回路!条件:起终点度数为奇数,其它点的度数为偶数.有x个联通块,每个联通块形成链,在每个联通块上跑dfs求出奇点数,由于是链所以至少为2,最后将所有联通块的链合并,将多算的起点和终点减去2,然后一条边能消去两个奇点,所以需要额外添加的边数为(总奇点数—2)/2,因为E可以取0所以最后还要和0取max. 1 #include <cstdio> 2

Inspector&#39;s Dilemma

In a country, there are a number of cities. Each pair of city is connected by a highway, bi-directional of course. A road-inspector’s task is to travel through the highways (in either direction) and to check if everything is in order. Now, a road-ins

UVA12118 Inspector&#39;s Dilemma(欧拉路径)

题目: 某个国家有V(V≤1000)个城市,每两个城市之间都有一条双向道路直接相连,长度为T(每条边的长度都是T).你的任务是找一条最短的道路(起点和终点任意), 使得该道路经过E条指定的边.输出这条道路的长度. 思路: 看完题目给出的两组数据,知道是一个欧拉路径的题目,然后考虑用并查集来统计连通分量的个数,然后答案就是这个个数减一+给出的边数E-- 这题细思极恐,如果一个连通分量里边有多个奇点,那么这样只统计连通分量个数的做法就不对了. 这是一个无向连通图,那么对于每一个连通分量我们可以把它变

6-14 Inspector s Dilemma uva12118(欧拉道路)

题意:给出一个国家城市个数n   所需走过道路个数e   每条道路长t   该国家任意两个城市之间都存在唯一道路长t     要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配  但是好像又无从下手 参考了其他人的做法  发现要用欧拉道路的知识 欧拉道路:如果一个联通图,形成欧拉路,那么度数为奇数的有两个,如果是欧拉环,则全部为度数为偶数的顶点. 一个图的 度数为奇数的个数一定是偶数!!!!! 当一个联通块 为一个环 或者度数为奇数的个数恰巧为两个时   不需要另外加路了  一笔画

(Incomplete)UVa 701 The Archeologist&#39;s Dilemma

方法:对数,暴力 我们需要求出最小的e,是的存在一个i > len(n) , 满足   floor[2^e/ (10^i)]= n, 即 n*10^i < 2^e < (n+1)*10^i.对两边同时取log10 (以10为底的对数,记作lg),得到 lg(n) + i < e*lg(2) < lg(n+1) + i. 注意len(n) = (int) lg(n)+1, 之前一个条件 i > len(n) 可以转化为 i > lg(n)+1,  然后暴力枚举即可.

UVA12188-Inspector&#39;s Dilemma(欧拉回路+连通性判断)

Problem UVA12188-Inspector's Dilemma Time Limit: 3000 mSec Problem Description In a country, there are a number of cities. Each pair of city is connected by a highway, bi-directional of course. A road-inspector's task is to travel through the highway

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d