日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Building Fire Stations 39届亚洲赛牡丹江站B题

發布時間:2025/6/17 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Building Fire Stations 39届亚洲赛牡丹江站B题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一棵樹,讓你再里面選取兩個點作為**點,然后所有點的權值是到這兩個點中最近的那個的距離,最后問距離中最長的最短是多少,輸出距離還有那兩個點(spj特判)。


思路:
? ? ?現場賽的時候我們壓根就沒看這道題,還有k題也是水題,可惜當時我們讀的題意不對<以為數字可以隨意斷開,然后拼接的數組可以再段。。>,最后只過了3個題,拿了個銅,不過沒啥遺憾,因為這是第一次去亞洲賽,沒空手而歸就是好事,下幾場放開了打就行了。

回到這個題目,其實這個題目我們可以判定的是這兩個點分別"罩著"兩棵樹<原因是最后的答案已經是小于等于樹的直徑的一半的,如果在同一側,那么答案就大于等于直徑的一半了>,這兩顆樹一定是整個樹從直徑斷開的分成的兩顆樹,那么我們就兩遍廣搜分成兩顆樹,然后再在兩顆樹上分別找直徑,然后兩個點就是直徑的中點,然后答案就是兩個塔到所有自己所在的那顆子樹上所有點的最大距離的最大距離,其他的還有一些細節,比如分成兩顆樹后有一棵樹只剩1個點的時候,去中點可能弄錯,這個地方注意點,具體細節可以看代碼


#include<stdio.h> #include<string.h> #include<queue>#define N_node 200000 + 10 #define N_edge 400000 + 20using namespace std;typedef struct {int node ,t; }NODE;typedef struct {int to ,next; }STAR;NODE xin ,tou; STAR E[N_edge]; int list[N_node] ,tot; int mer[N_node] ,mark[N_node]; int root[N_node];void add(int a ,int b) {E[++tot].to = b;E[tot].next = list[a];list[a] = tot;E[++tot].to = a;E[tot].next = list[b];list[b] = tot; }int maxx ,mknode; void BFS(int s ,int aa ,int bb) {queue<NODE>q;memset(mark ,0 ,sizeof(mark));xin.node = s ,xin.t = 0;mark[s] = 1;q.push(xin);maxx = 0 ,mknode = s;while(!q.empty()){tou = q.front();q.pop();if(maxx < tou.t){maxx = tou.t;mknode = tou.node;}for(int k = list[tou.node] ;k ;k = E[k].next)if(!mark[E[k].to]){xin.node = E[k].to;xin.t = tou.t + 1;if(aa == tou.node && bb == xin.node || aa == xin.node && bb == tou.node)continue;mer[xin.node] = tou.node;mark[E[k].to] = 1;q.push(xin);}} }int main () {int n ,t ,i ,a ,b;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);memset(list ,0 ,sizeof(list)) ,tot = 1;for(i = 1 ;i < n ;i ++){scanf("%d %d" ,&a ,&b);add(a ,b);}BFS(1 ,-1 ,-1);int mk1 = mknode; BFS(mk1 ,-1 ,-1);int mk2 = mknode;int nowid = 0;int x = mk2;while(x != mk1){root[++nowid] = x;x = mer[x];}root[++nowid] = mk1;int aa = root[nowid/2];int bb = root[nowid/2+1];BFS(aa ,aa ,bb);mk1 = mknode;BFS(mk1 ,aa ,bb);mk2 = mknode;nowid = 0;x = mk2;while(x != mk1){root[++nowid] = x;x = mer[x];}root[++nowid] = mk1;//for(i = 1 ;i <= nowid ;i ++)//printf("%d *\n" ,root[i]);//puts("");int aaa = root[nowid/2+1]; BFS(bb ,aa ,bb);mk1 = mknode;BFS(mk1 ,aa ,bb);mk2 = mknode;nowid = 0;x = mk2;while(x != mk1){root[++nowid] = x;x = mer[x];}root[++nowid] = mk1;int bbb = root[nowid/2+1];BFS(aaa ,aa ,bb);int Ans1 = maxx;BFS(bbb ,aa ,bb);int Ans2 = maxx;int Ans = Ans1 > Ans2 ? Ans1 : Ans2;printf("%d %d %d\n" ,Ans ,aaa ,bbb);}return 0; }

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Building Fire Stations 39届亚洲赛牡丹江站B题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。