题目链接:点击查看

题目大意:首先给出n个点,n*(n-1)/2条边组成的无向图,边的权值为y,现在给出一棵连接n个点的树,树上的权值都是x,现在问如何在每个点只遍历一次的情况下走遍n个点,并使一路上权值最小,输出最小权值

题目分析:因为我们需要将n个点连成一条链,所以所需要遍历的边一定是n-1条边,我们现在要做的就是分析如何让这n-1条边的权值和尽量小

我们可以大致分为两种情况来分析:

  1. x>=y:当树上的权值大于图上的权值时,我们肯定以贪心的思想尽可能的不走树上的边:

    1. 若该图为菊花图,则中心点只能走树上的边到达其他n-1个点,故此时的答案为(n-2)*y+x
    2. 若该图不是菊花图,则任意两点之间肯定有非树边进行连接,故此时的答案为(n-1)*y
  2. x<y:此时树上的权值小于图上的权值,所以贪心的思想肯定尽可能少的走图上的边,我们假设需要走ans条树上的边,那么答案就是ans*x+(n-1-ans)*y

我们可以将第二种情况进一步分析,我们可以将n个点分为不同长度的数个区块,每个区块中的点都可以通过一条链到达,那么我们就可以用图上的边来连接每个区块即可

这样说可能还是有点抽象,我们直接具体到某个节点来分析:

  1. 若当前节点x的子节点数大于等于2,那么我们任取两个子节点,根据贪心的思想,将这两个子节点和节点x相连为一条链,分为一个单独的区块,那么剩下的子节点,肯定不能通过节点x到达其祖先节点了,所以只能通过图上的边与其他的点相连
  2. 若当前节点x的子节点数小于等于1,我们可以直接将其子节点与节点x相连,并且继续向上延伸,就不用图上的边辅助了

根据上面两种情况设计一下dfs求出ans,答案就出来了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;vector<int>node[N];int ans=0;bool dfs(int u,int f)
{int son=2;//子节点数for(auto v:node[u]){if(v==f)continue;if(dfs(v,u)&&son)//若此时节点u的子节点v可以顺上来一条链,并且当前子节点是前两个,那么就可以将节点u和节点v用树边连接
//若此时节点u的子节点v已经是大于等于2的子节点了,就不能通过树边连接节点u和节点v了{son--;ans++;}}return son>0;//如果节点u的子节点数小于等于1,那么就可以顺一条链上去,否则就是情况1,也就是节点u被两个子节点所占用
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,x,y;scanf("%d%d%d",&n,&x,&y);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}if(x>=y){bool flag=true;for(int i=1;i<=n;i++)if(node[i].size()==n-1)//判断菊花图{flag=false;break;}if(flag)printf("%lld\n",1LL*(n-1)*y);elseprintf("%lld\n",1LL*(n-2)*y+x);}else{dfs(1,0);printf("%lld\n",1LL*ans*x+1LL*(n-1-ans)*y);}return 0;
}

CodeForces - 618D Hamiltonian Spanning Tree(思维+贪心)相关推荐

  1. Codeforces 1633 E. Spanning Tree Queries ——暴力,kruskal,思维

    This way 题意: 给你一张无向带权图,每次给你一个w,然后图中每条边的权值-w后取绝对值.并构造最小生成树.你的答案异或上这棵树的总权值,问你最后答案是多少. 题解: 我把+1写在了括号里,导 ...

  2. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  3. 数据结构与算法笔记:贪心策略之BSTBBST, Hashtable+Dictionary+Map, Priority Queue~Heap, Minium Spanning Tree

    BST & BBST BST(Binary Search Tree) 二叉搜索树,也就是使用二叉树来做查找 BBST(Balanced Binary Search Tree) 平衡二叉搜索树 ...

  4. 【Codeforces Round #544 (Div. 3) F2. Spanning Tree with One Fixed Degree】DFS

    F2. Spanning Tree with One Fixed Degree 题意 给你nnn个点mmm条边的无向联通图,找出一棵生成树,使111这个点的度=d=d=d. 1≤n,m≤1051 \l ...

  5. 2021ICPC(澳门) - LCS Spanning Tree(广义后缀自动机)

    题目链接:点击查看 题目大意:给出一个含有 nnn 个点的无向图,点权为一个字符串,每条边的边权为相邻两点的 LCSLCSLCS,本题的 LCSLCSLCS 定义为两个字符串的最长公共子串的长度 求出 ...

  6. codeforces#320(div2) D Or Game 贪心

    codeforces#320(div2) D  "Or" Game  贪心 D. "Or" Game time limit per test 2 seconds ...

  7. Codeforces 1077B Disturbed People(思维题)

    Codeforces 1077B Disturbed People(思维题) There is a house with nn flats situated on the main street of ...

  8. 《Boost》Part1 Minimum Spanning Tree

    <Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...

  9. 2019ICPC(上海) - Spanning Tree Removal(构造)

    题目链接:点击查看 题目大意:给出一个 nnn 个点的无向完全图,每次操作可以删掉包含 nnn 个点的一棵生成树中的所有边,问最多可以删几次 题目分析:典中典之欧拉通路构造题,构造方式如下: 在选定某 ...

最新文章

  1. plsql设置字段可为空_2015最新整理PLSQL常用设置
  2. 用ABAP实现SM36的设置后台JOB
  3. Loadrunner学习笔记(三)
  4. 开源许可证的变更带给我们什么启示?
  5. java屏蔽编译告警_java-禁止JAXB生成的类上的编译器警告
  6. 数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法
  7. 网络无人值守安装linux----kickstart
  8. vs2010 “最近使用的项目”为空?解决办法!
  9. OSTimeGet()--获取当前时间
  10. 040、JVM实战总结:案例实战:每日百亿数据量的实时分析引擎,为啥频繁发生Full GC ?
  11. 【笔记】运筹(下)——Rita_Aloha
  12. iOS 强制旋转屏幕
  13. c语言汉字属于什么类型_带你学习C语言—数据类型
  14. springboot通过maven管理mysql驱动加载失败
  15. 應用高解析度線掃描CCD於ITO導電玻璃表面瑕疵檢測之研究
  16. 浅谈SRAM与DRAM的异同
  17. aix xmanager oracle,AIX上启动xmanager界面
  18. 联诚发召开宝安区卓越绩效管理标准实施项目启动大会
  19. C++对接国际验证码接口DEMO示例
  20. 【大数进制转换】清华大学考研复试上机——进制转换(10—2)

热门文章

  1. 登录方式1:MySQL自带客户端
  2. mysql 字符编码
  3. 搭建K8s集群(kubeadm方式)-操作系统初始化
  4. SpringSecurity权限管理介绍
  5. Zookeeper的前世今生
  6. Quartz调度原理
  7. Redis中的数据迁移
  8. Java实现消息消费
  9. 反射获取有参数的构造方法并运行
  10. HDFS的Secondarynamenode工作机制