2019牛客暑期多校訓練營(第四場)A題 樹的直徑

2021-09-25 16:11:29 字數 952 閱讀 4214

兩邊bfs  第一遍求任意所選節點到另一所選節點的距離最大的那個點(假設是a),第二遍求a到另一所選節點的距離最大值,也就是樹的直徑

ac**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const ll inff=0x3f3f3f3f3f3f3f3f;

const ll max_n=10005;

const ll max_m=100005;

#define mef(x) memset(x,-1,sizeof(x))

#define me0(x) memset(x,0,sizeof(x))

#define mei(x) memset(x,inf,sizeof(x))

struct edge

edge[200005];

int cnt,first[100005],vis1[100005];

void init()

void add(int u,int v)

int bfs(int x,int y)

if(vis1[lx])

q.pop();

for(int i=first[lx];i!=-1;i=edge[i].next)}}

if(!y)

else

}int main()

me0(vis1);

for(int i=1;i<=k;i++)

int re=bfs(al[1],0);

re=bfs(re,1);

cout

}

2019牛客暑期多校訓練營(第四場

a meeting 答案為最遠關鍵點的距離的一半向上取整,也就是關鍵點的樹的直徑的一半向上取整。先考慮兩個點,他倆是最遠距離,那麼最短時間就是 d 2 在此基礎上再加乙個點 前提是加上這個點,後不影響初始條件,即初始的兩個點之間的距離最遠 那麼不會影響答案,因為他與另外兩個點的相會的時間必然小於 d...

2019牛客暑期多校訓練營(第四場)A

題意 給定n個頂點,n 1條邊權為1的邊,將各個頂點連成乙個最小生成樹,再給定乙個k,表示有多少個人,每個人都在特點的乙個頂點上,現在這些人要相會,求使得這些人能夠相聚在一起的最短時間。看了標程,答案就是k個人當中那2個距離最遠的人的距離d,答案就是d 2向上取整。證明 必要性 k個人當中,最遠的那...

牛客暑期多校訓練營B Boundary

給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...