【19.27%】【codeforces 618D】Hamiltonian Spanning Tree
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
A group of n cities is connected by a network of roads. There is an undirected road between every pair of cities, so there are roads in total. It takes exactly y seconds to traverse any single road.
A spanning tree is a set of roads containing exactly n - 1 roads such that it’s possible to travel between any two cities using only these roads.
Some spanning tree of the initial network was chosen. For every road in this tree the time one needs to traverse this road was changed from y to x seconds. Note that it’s not guaranteed that x is smaller than y.
You would like to travel through all the cities using the shortest path possible. Given n, x, y and a description of the spanning tree that was chosen, find the cost of the shortest path that starts in any city, ends in any city and visits all cities exactly once.
Input
The first line of the input contains three integers n, x and y (2 ≤ n ≤ 200 000, 1 ≤ x, y ≤ 109).
Each of the next n - 1 lines contains a description of a road in the spanning tree. The i-th of these lines contains two integers ui and vi (1 ≤ ui, vi ≤ n) — indices of the cities connected by the i-th road. It is guaranteed that these roads form a spanning tree.
Output
Print a single integer — the minimum number of seconds one needs to spend in order to visit all the cities exactly once.
Examples
input
5 2 3
1 2
1 3
3 4
5 3
output
9
input
5 3 2
1 2
1 3
3 4
5 3
output
8
Note
In the first sample, roads of the spanning tree have cost 2, while other roads have cost 3. One example of an optimal path is .
In the second sample, we have the same spanning tree, but roads in the spanning tree cost 3, while other roads cost 2. One example of an optimal path is .
【题解】
给你一个完全图n*(n-1)/2的图;
这个图的所有边边权都为y;
然后再对这个图的某个生成树上的边进行修改;这个生成树上的边边权从y改成x;
(这个生成树就是给你的n-1条边组成的树);
然后让你求遍历所有的边的最小边权和(每个点只能走一次);
如果x小于y;
则我们最后的路径应该在那个所给的生成树上的边尽可能地多;
怎样保证呢?
从任意一个点进行dfs(假如从1点开始);
每个点可以连接点边数肯定是2(大于3就不能保证每个点只走一次);
上图是样例输入的情形。
最后dfs能形成两条路径
1->2
和5->3->4
然后从这两个子图里面比如引一条2指向5的y边权边过去;就能遍历整张图了;
这个dfs的依据就是每个点最多只能联通两条边;
在dfs的时候记录这个点还能连几条边;
然后判断一下目标点能连几条边;如果都能连(都大于0)则连一条边;
如果y<=x
让非生成树边最多;
其实只有没有一个点和其余n-1个点相连的情况都能保证遍历的时候全是非生成树边;因为你总可以和那个不能通过生成树边到达的点通过非生成树边到达;
则特判一下就好;
如果有一个点能和其他n-1个点相连答案就是x+(n-2)*y否则就都是(n-1)*y;
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define LL long long
using namespace std;
const int MAXN = 2e5+10;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0);
int n;
LL x,y,in=0;
vector <int> a[MAXN];
void input_LL(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void input_int(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
bool dfs(int x,int fa)
{
int rest = 2;
int len = a[x].size();
for (int i =0 ;i <= len-1;i++)
{
int y = a[x][i];
if (y==fa)
continue;
bool j = dfs(y,x);
if (rest&&j)
{
rest--;
in++;
}
}
return rest>0;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_int(n);input_LL(x);input_LL(y);
for (int i = 1;i <= n-1;i++)
{
int x0,y0;
input_int(x0);input_int(y0);
a[x0].push_back(y0);
a[y0].push_back(x0);
}
if (x<y)
{
dfs(1,-1);
LL ans = in*x + (n-1-in)*y;
cout << ans << endl;
}
else
{
for (int i = 1;i <= n;i++)
{
int len = a[i].size();
if (len == n-1)
{
cout << x+(n-2)*y<<endl;
return 0;
}
}
cout << (n-1)*y<<endl;
}
return 0;
}
【19.27%】【codeforces 618D】Hamiltonian Spanning Tree的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- Codeforces 618D Hamiltonian Spanning Tree(树的最小路径覆盖)
题意:给出一张完全图,所有的边的边权都是 y,现在给出图的一个生成树,将生成树上的边的边权改为 x,求一条距离最短的哈密顿路径. 先考虑x>=y的情况,那么应该尽量不走生成树上的边,如果生成树上 ...
- CodeForces 618D Hamiltonian Spanning Tree
题意:要把所有的节点都访问一次,并且不能重复访问,有两种方式访问,一种是根据树上的路径 走和当前节点连接的下一个节点cost x, 或者可以不走树上边,直接跳到不与当前节点连接的节点,cost y 分 ...
- Codeforces Edu3 E. Minimum spanning tree for each edge
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces 1682 D Circular Spanning Tree
题意 1-n排列,构成一个圆:1-n每个点有个值0或者1,0代表点的度为偶数,1代表点的度为计数:询问能否构成一棵树,树的连边在圆内不会相交,在圆边上可以相交,可以则输出方案. 提示 1. 首先考虑什 ...
- 【19.77%】【codeforces 570D】Tree Requests
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【27.91%】【codeforces 734E】Anton and Tree
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【51.27%】【codeforces 604A】Uncowed Forces
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【27.85%】【codeforces 743D】Chloe and pleasant prizes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- 通过WMI的方式去设置LCD背光亮度
code例如以下: #include "stdafx.h" #include <objbase.h> #include <windows.h> #inclu ...
- Spring Boot 动态数据源(Spring 注解数据源)
本文实现案例场景:某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于 ...
- 辛星彻底帮您解决CSS中的浮动问题
浮动,是CSS布局中必须经过的一道坎,假设不熟悉浮动.那么CSS的布局就如同空中楼阁,而谈到浮动,很多其它的是和div相结合,div是一个块级元素.这个我前面的博文有介绍,假设大家喜欢我的风格,能够搜 ...
- LoaderManager使用具体解释(一)---没有Loader之前的世界
来源: http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html 感谢作者Alex ...
- stm32的adc时钟周期,ADC_SampleTime_1Cycles5是多长时间
- 一位90后程序员的自述:如何从年薪3w到30w!
初入职场之时,大多数人都应该考虑过这样的一个问题,如何找到一种实用,简化web流程的方法,在工作之中能有所提升和突破. 学好哪些?基础必须精通! 九层之塔,起于垒土;千里之行,始于足下.入门之前,这些 ...
- 键盘钩子监测按键后,获取键码及按键名称(MFC)
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam){ if(nCode ==HC_ACTION & ...
- Nginx+Tomcat搭建高性能负载均衡集群的实现方法
一. 目标实现高性能负载均衡的Tomcat集群: 二.步骤 1.首先下载Nginx,要下载稳定版: 2.然后解压两个Tomcat,分别命名为apache-tomcat-6.0.33-1和apac ...
- 利用IIdentify接口实现点选和矩形选择要素
duckweeds 原文利用IIdentify接口实现点选和矩形选择要素 Identify接口定义了获得要素图层单个要素的属性的捷径方法.它有一个Identify方法,返回一个IArray数组对象. ...
- php替换空格(php函数的设计思路)
php替换空格(php函数的设计思路) 一.总结 1.替换和也是先查找了再替换,截取的话就是先查找到再截取 2.设计函数的时候按照的是缺省参数在后,核心东西在前的思路来设计函数的:查找的话是$sear ...