题目大意:
给定一颗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相关推荐

  1. super(Student,self).__init__()初始化的是什么东西?

    继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...

  2. Google Pixel 超分辨率--Super Resolution Zoom

    Google Pixel 超分辨率–Super Resolution Zoom Google 的Super Res Zoom技术,主要用于在zoom时增强画面细节以及提升在夜景下的效果. 文章的主要贡 ...

  3. 【译】为什么要写super(props)

    译注: 原文地址 https://overreacted.io/why-do-we-write-super-props/ 正文 我听说Hooks是新的热点.好笑的是,我想通过描述一些关于class组件 ...

  4. java super快速生成_为什么当我使用编辑器代码生成器时,eclipse会在构造函数中自动添加一个java super()方法?...

    正如@Kon在他的评论中提到的, Java中的一个空构造函数包含对超类构造函数的隐式调用. 此外,没有明确调用super()的非空构造函数将在顶部具有隐式调用. 离开super()调用是唯一的时候,如 ...

  5. java super是引用变量吗_Java中super的几种用法并与this的区别

    1.     子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...

  6. def __init__(self)是什么意思_子类必须调用 super().__init__() 吗?

    我新开了专栏 <恍然大明白>,如果关注 Python 底层实现,请移步 恍然大明白​www.zhihu.com 今天遇到一个有意思的问题,小组一位小哥在开发中,遇到了传说中的 " ...

  7. This和Super关键字的对比

    this和Super关键字 this和Super关键字的对比 Super关键字的用法如下: 1. super关键字代表了父类空间的引用: 2. super关键字的作用: 3. super关键字调用父类 ...

  8. java中super用来定义父类,Java中super的几种用法及与this的区别

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  9. android中方法调用super(..)的相关知识

    java中的多态有重写 方法被子类重写后 父类的原方法就会被隐藏 当你又需要调用父类所定义的原方法  这个时候就可以用super来调用 super调用指向了父类,在一些调用里可以很巧妙的利用,比如监听 ...

  10. Java中的两个关键字——super、this

    Java中的两个关键字--super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...

最新文章

  1. Linux_DNS服务器
  2. php字符串加密解密源码,PHP中加密解密字符串函数源代码
  3. UVa10763 交换学生
  4. 03-C语言的注释与转义字符
  5. close 不弹出对话框
  6. 生活中的计算机趣味知识大全,五个有趣的电脑小知识
  7. python接口测试实战_Python接口测试实战01:七种武器
  8. 模拟知乎登陆(requests和scrapy)
  9. 网络规划设计师考试经验分享
  10. aidl使用_Android-Service学习鸭-入门实践-远程服务(bindService方式-AIDL)
  11. WCF 第五章 行为
  12. 心理学推荐书籍——《色眼识人》
  13. cf服务器延迟测试,Cloudflare-SpeedTest - 测试 CF CDN 延迟和速度,CF自选IP
  14. 迪杰斯特拉算法简单实现
  15. JS 实现小游戏 打砖块
  16. adb connect 连接机顶盒显示:由于目标计算机积极拒绝,无法连接10061
  17. 免费的几款内网穿透工具
  18. 【强推文章】如果你在犹豫要不要去外包公司,不妨看看这篇文章(自己深有感触)
  19. Thread.interrupted()与Thread.currentThread().isInterrupted()区别
  20. Centos 7 ngrok服务器搭建

热门文章

  1. VB计算圆周率(二)
  2. 汇编程序16位带符号变量计算
  3. QQ自动登录 发消息给某人C++/C
  4. 利用集成学习(Adaboost(DTs))对高光谱影像数据集(mat)分类
  5. mysql数据库无法启动_Mysql数据库无法启动问题的解决方案
  6. 阿里巴巴高级技术专家章剑锋:大数据发展的 8 个要点
  7. 【React Native 安卓开发】----(View实战之仿携程)【第三篇】
  8. 图解微服务技术架构体系
  9. OpenGL ES总结(五)OpenGL ES中pipeLine机制
  10. Android app内存管理的16点建议