F.Three pahs on a tree

 

 思路

  两次bfs找出树的直径并处理出端点离树上各叶子节点的距离,在直径上找一点的子树叶子p3,使得dis(p1,p2) + dis(p2,p3) + dis(p1,p3)最大

  易知上式是路径实长的两倍

 

  1 #include <bits/stdc++.h>
  2 #define dbg(x) cout << #x << "=" << x << endl
  3 #define eps 1e-8
  4 #define pi acos(-1.0)
  5 
  6 using namespace std;
  7 typedef long long LL;
  8 
  9 template<class T>inline void read(T &res)
 10 {
 11     char c;T flag=1;
 12     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
 13     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
 14 }
 15 
 16 namespace _buff {
 17     const size_t BUFF = 1 << 19;
 18     char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
 19     char getc() {
 20         if (ib == ie) {
 21             ib = ibuf;
 22             ie = ibuf + fread(ibuf, 1, BUFF, stdin);
 23         }
 24         return ib == ie ? -1 : *ib++;
 25     }
 26 }
 27 
 28 int qread() {
 29     using namespace _buff;
 30     int ret = 0;
 31     bool pos = true;
 32     char c = getc();
 33     for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
 34         assert(~c);
 35     }
 36     if (c == '-') {
 37         pos = false;
 38         c = getc();
 39     }
 40     for (; c >= '0' && c <= '9'; c = getc()) {
 41         ret = (ret << 3) + (ret << 1) + (c ^ 48);
 42     }
 43     return pos ? ret : -ret;
 44 }
 45 
 46 const int maxn = 2e5 + 7;
 47 
 48 int head[maxn << 1], edge[maxn << 1], nxt[maxn << 1];
 49 int w[maxn << 1];
 50 int vis[maxn];
 51 int dis[maxn];
 52 
 53 int n, cnt;
 54 
 55 void BuildGraph(int u, int v, int c) {
 56     cnt++;
 57     edge[cnt] = v;
 58     nxt[cnt] = head[u];
 59     w[cnt] = c;
 60     head[u] = cnt;
 61 }
 62 
 63 int bfs(int x) {
 64     memset(vis, 0, sizeof(vis));
 65     memset(dis, 0, sizeof(dis));
 66     int pos = 0;
 67     queue <int> q;
 68     q.push(x);
 69     vis[x] = 1;
 70     int u;
 71     while(!q.empty()) {
 72         u = q.front();
 73         //dbg(u);
 74         q.pop();
 75         for (int i = head[u]; i; i = nxt[i]) {
 76             int v = edge[i];
 77             int d = w[i];
 78             if(vis[v])
 79                 continue;
 80             else {
 81                 dis[v] = dis[u] + d;
 82                 vis[u] = 1;
 83                 if(dis[v] > dis[pos]) {
 84                     pos = v;
 85                 }
 86                 q.push(v);
 87             }
 88         }
 89     }
 90     return pos;
 91 }
 92 
 93 int d1[maxn], d2[maxn];
 94 
 95 int main()
 96 {
 97     read(n);
 98     int a, b;
 99     for ( int i = 1; i < n; ++i ) {
100         read(a);
101         read(b);
102         BuildGraph(a, b, 1);
103         BuildGraph(b, a, 1);
104     }
105     int p1, p2;
106     p1 = bfs(1);
107     p2 = bfs(p1);
108     for ( int i = 1; i <= n; ++i ) {
109         d1[i] = dis[i];     
110     }   
111     int p3 = bfs(p2);
112     for ( int i = 1; i <= n; ++i ) {
113         d2[i] = dis[i];
114     }
115     int p4 = 0;
116     for ( int i = 1; i <= n; ++i ) {
117         if(d1[i] + d2[i] > d1[p4] + d2[p4] && i != p1 && i != p2) {
118             p4 = i;
119         }
120     }
121     int ans = d1[p4]+d2[p4]+d1[p2];
122     //dbg(ans);
123     printf("%d\n",ans / 2);
124     printf("%d %d %d\n",p1,p2,p4);
125     return 0;
126 }
View Code

 

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务