題解 核心城市

2022-04-01 05:40:12 字數 1956 閱讀 1795

【題目描述】

x 國有 \(n\) 座城市,\(n − 1\) 條長度為 \(1\) 的道路,每條道路連線兩座城市,且任意兩座城市都能通過若干條道路相互到達,顯然,城市和道路形成了一棵樹。

x 國國王決定將 \(k\) 座城市欽定為 x 國的核心城市,這 \(k\) 座城市需滿足以下兩個條件:

這 \(k\) 座城市可以通過道路,在不經過其他城市的情況下兩兩相互到達。

定義某個非核心城市與這 \(k\) 座核心城市的距離為,這座城市與 \(k\) 座核心城市的距離的最小值。那麼所有非核心城市中,與核心城市的距離最大的城市,其與核心城市的距離最小。你需要求出這個最小值。

【輸入格式】

第一行 \(2\) 個正整數 \(n,k\)。

接下來 \(n - 1\) 行,每行 \(2\) 個正整數 \(u,v\),表示第 \(u\) 座城市與第 \(v\) 座城市之間有一條長度為 \(1\) 的道路。

【輸出格式】

一行乙個整數,表示答案。

【輸入樣例】

1 2

2 32 4

1 55 6

【輸出樣例】
1
【樣例解釋】

欽定 \(1,2,5\) 這 \(3\) 座城市為核心城市,這樣 \(3,4,6\) 另外 \(3\) 座非核心城市與核心城市的距離均為 \(1\),因此答案為 \(1\)。

【資料規模與約定】

這題的前置知識是會求直徑。

我們可以顯然證明,直徑的中點肯定是 \(k\) 座核心城市之一。

偽證證明:

我們可以假設乙個節點 \(x\) 是直徑外,離直徑最近的乙個點。

顯然,直徑上的任意乙個點到核心城市的距離,就是他到 \(x\) 的距離。

並且由於直徑是樹中最長的一條路徑,所以沒有其他點到 \(x\) 的距離大於直徑端點到 \(x\) 的距離。

所以 \(x\) 在直徑的時候,可以使與核心城市的距離最大的城市,其與核心城市的距離最小。

再證明 \(x\) 必須為直徑的中點。

當 \(x\) 不為直徑的中點時,必定有乙個直徑端點到 \(x\) 的距離稍稍的大那麼一點點,只有當 \(x\) 為直徑中點時,兩個直徑端點到 \(x\) 的最大值才會最小。

在找直徑的時候,記錄每個點的父親,找到端點後,進行回溯,找到直徑的中點。

然後貪心的思想,對於每個節點 \(i\),按照,以直徑的中點為根,設 \(deep_i\) 為 \(i\) 節點的深度,\(maxdeep_i\) 表示 \(i\) 能到的最大深度。

按照能到達的最大深度減該節點的深度排序,取前 \(k\) 個數,就可以保證,與核心城市的距離最大的城市,其與核心城市的距離最小。

而且所選的點肯定是聯通的。

**如下:

#include#define rint register int

using namespace std;

int read()

while(c>='0'&&c<='9')s=(s<<1)+(s<<3)+(c^48),c=getchar();

return f?s:-s;

}int n,k,dis[100010],vis[100010],point,faq;

int tot,head[200010],ver[200010],nxt[200010];

int pl[100010],maxdeep[100010],deep[100010];

int ans[100010],minn=-1;

bool cmp(int x,int y)

void add(int x,int y)

void bfs(int s)}}

faq=0;

for(rint i=1;i<=n;++i)

if(dis[i]>faq) faq=dis[i],point=i;

}void dfs(int x,int fa)

}int main()

TJOI 2017 城市 題解

題目傳送門 題目大意 給一棵邊帶權的樹,你可以將一條邊換個位置,換完之後還得是一棵樹,要求換完之後樹的直徑最小。o n o n o n 做法太強了,只能想到 o n 2 o n 2 o n2 的做法 考慮列舉刪去哪一條邊,假如刪掉當前列舉的邊,那麼整棵樹會被分成兩個部分,然後我們要把這條邊重新找個位...

題解 Luogu1453 城市環路

給你一棵樹,強制要求一條邊只能選乙個點,並且還額外給條邊 s t s,t 說s,t也不能同時選,求最大貢獻 這不是擺明了那你用樹形dp切掉的節奏嗎?設f u 0 1 f u 0 1 表示以u u 為根的字樹,u role presentation u u點選或不選的最大貢獻 然後轉移比較顯然,1.如...

題解 城市交通 附資料

另一道水題 某城市 有n 1 n 50 個街區,某些街區由公共汽車線路相連,如在圖1中,街區1,2有一條公共汽車線路相連,且由街區1至街區2的時間為34分鐘。由於街區與街區之間的距離較近,與等車時間相比可忽略不記,所以這個時間為兩趟公共汽車的間隔時間,即平均的等車時間。由街區1至街區5的最快走法為1...