[CF592D]Super M
题目大意:
给定一颗n个节点树,边权为1,树上有m个点被标记,问从树上一个点出发,经过所有被标记的点的最短路程,以及可行的最小的端点编号。(起终点自选)
M<=N<=123456
思路:
随便定一个标记节点为根,然后以该节点开始遍历,将不是标记节点的叶节点剪掉,剩下的边数为P。求出树的直径L。答案即为2*P-L。
另外注意一定要保证节点编号最小。
1 #include<cstdio> 2 #include<cctype> 3 #include<vector> 4 #include<algorithm> 5 inline int getint() { 6 int ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 10 return x; 11 } 12 const int N=123457,inf=0x7fffffff; 13 int n,m; 14 bool a[N]={0}; 15 struct Edge { 16 int to; 17 bool cut; 18 }; 19 std::vector<Edge> e[N]; 20 inline void add_edge(const int u,const int v) { 21 e[u].push_back((Edge){v,false}); 22 e[v].push_back((Edge){u,false}); 23 } 24 int u=inf,x=inf,v=inf,l=0; 25 void find_u(const int x,const int parent,const int depth) { 26 if(depth>l) { 27 l=depth; 28 u=x; 29 } 30 else if(depth==l) { 31 u=std::min(u,x); 32 } 33 for(unsigned int i=0;i<e[x].size();i++) { 34 if(e[x][i].to==parent||e[x][i].cut) continue; 35 find_u(e[x][i].to,x,depth+1); 36 } 37 } 38 void find_v(const int x,const int parent,const int depth) { 39 if(depth>l) { 40 l=depth; 41 v=x; 42 } 43 else if(depth==l) { 44 v=std::min(v,x); 45 } 46 for(unsigned int i=0;i<e[x].size();i++) { 47 if(e[x][i].to==parent||e[x][i].cut) continue; 48 find_v(e[x][i].to,x,depth+1); 49 } 50 } 51 bool cut(const int x,const int parent) { 52 bool ret=true; 53 for(unsigned int i=0;i<e[x].size();i++) { 54 if(e[x][i].to==parent) continue; 55 if(cut(e[x][i].to,x)) { 56 e[x][i].cut=true; 57 n--; 58 } 59 else { 60 ret=false; 61 } 62 } 63 return ret&&!a[x]; 64 } 65 int main() { 66 n=getint()-1,m=getint(); 67 for(int i=0;i<n;i++) add_edge(getint(),getint()); 68 int x=inf; 69 for(int i=0;i<m;i++) { 70 int t=getint(); 71 a[t]=true; 72 x=std::min(x,t); 73 } 74 cut(x,0); 75 find_u(x,0,0); 76 find_v(u,0,0); 77 printf("%d\n%d\n",std::min(u,v),(n<<1)-l); 78 return 0; 79 }
转载于:https://www.cnblogs.com/skylee03/p/7141930.html
[CF592D]Super M相关推荐
- super(Student,self).__init__()初始化的是什么东西?
继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...
- Google Pixel 超分辨率--Super Resolution Zoom
Google Pixel 超分辨率–Super Resolution Zoom Google 的Super Res Zoom技术,主要用于在zoom时增强画面细节以及提升在夜景下的效果. 文章的主要贡 ...
- 【译】为什么要写super(props)
译注: 原文地址 https://overreacted.io/why-do-we-write-super-props/ 正文 我听说Hooks是新的热点.好笑的是,我想通过描述一些关于class组件 ...
- java super快速生成_为什么当我使用编辑器代码生成器时,eclipse会在构造函数中自动添加一个java super()方法?...
正如@Kon在他的评论中提到的, Java中的一个空构造函数包含对超类构造函数的隐式调用. 此外,没有明确调用super()的非空构造函数将在顶部具有隐式调用. 离开super()调用是唯一的时候,如 ...
- java super是引用变量吗_Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...
- def __init__(self)是什么意思_子类必须调用 super().__init__() 吗?
我新开了专栏 <恍然大明白>,如果关注 Python 底层实现,请移步 恍然大明白www.zhihu.com 今天遇到一个有意思的问题,小组一位小哥在开发中,遇到了传说中的 " ...
- This和Super关键字的对比
this和Super关键字 this和Super关键字的对比 Super关键字的用法如下: 1. super关键字代表了父类空间的引用: 2. super关键字的作用: 3. super关键字调用父类 ...
- java中super用来定义父类,Java中super的几种用法及与this的区别
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
- android中方法调用super(..)的相关知识
java中的多态有重写 方法被子类重写后 父类的原方法就会被隐藏 当你又需要调用父类所定义的原方法 这个时候就可以用super来调用 super调用指向了父类,在一些调用里可以很巧妙的利用,比如监听 ...
- Java中的两个关键字——super、this
Java中的两个关键字--super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...
最新文章
- Linux_DNS服务器
- php字符串加密解密源码,PHP中加密解密字符串函数源代码
- UVa10763 交换学生
- 03-C语言的注释与转义字符
- close 不弹出对话框
- 生活中的计算机趣味知识大全,五个有趣的电脑小知识
- python接口测试实战_Python接口测试实战01:七种武器
- 模拟知乎登陆(requests和scrapy)
- 网络规划设计师考试经验分享
- aidl使用_Android-Service学习鸭-入门实践-远程服务(bindService方式-AIDL)
- WCF 第五章 行为
- 心理学推荐书籍——《色眼识人》
- cf服务器延迟测试,Cloudflare-SpeedTest - 测试 CF CDN 延迟和速度,CF自选IP
- 迪杰斯特拉算法简单实现
- JS 实现小游戏 打砖块
- adb connect 连接机顶盒显示:由于目标计算机积极拒绝,无法连接10061
- 免费的几款内网穿透工具
- 【强推文章】如果你在犹豫要不要去外包公司,不妨看看这篇文章(自己深有感触)
- Thread.interrupted()与Thread.currentThread().isInterrupted()区别
- Centos 7 ngrok服务器搭建