兩邊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...