XR 3 核心城市 樹直徑

2022-05-31 12:45:18 字數 1381 閱讀 9129

【xr-3】核心城市

這題真的難啊.........

k個核心城市太麻煩,我們假設先找乙個核心城市,應該放在**?

\(任意取乙個點,它的最遠端是直徑的端點。\)

\(所以當這個點是直徑的中點時,可以達到題目的要求(最大距離最小)\)

\(想求中點,我們就儲存直徑的路徑,中間的點就是中點了。\)

\(然後該怎麼辦?其餘的k-1個點怎麼選?\)

\(發現7、8號節點距離可核心城市最遠,目前影響答案的是他們,所以我們下一步應該把2和3號節點變成核心城市\)

\(至此,貪心策略已經出來了\)

\(在以直徑中點為根的樹中,我們總是選取那些maxdeep-mydeep最大的節點\)

\(其中maxdeep是當前節點能到的最大深度,也就是這個分支離核心城市最遠的節點\)

\(deep是自己的深度\)

#include using namespace std;

const int maxn=200009;

struct pd[maxn];int n,k,cnt=1;

int head[maxn],dis[maxn],deep[maxn],maxdeep[maxn],f[maxn];

void add(int u,int v)

int num,juli=0;

void dfs1(int now,int ju,int fa)

for(int i=head[now];i;i=d[i].nxt) }

void dfs2(int now,int ju,int fa)

for(int i=head[now];i;i=d[i].nxt) }

void dfsz(int now,int fa)

}bool com(int a,int b)

int main()

dfs1(1,0,0);//找出直徑的端點

juli=0;

dfs2(num,0,0);//找出直徑的路徑

int mid=num;//直徑的端點

for(int i=1;i<=(1+juli)/2;i++)//一共經過了juli個點

mid=f[mid];

dfsz(mid,0);

for(int i=1;i<=n;i++) deep[i]=maxdeep[i]-deep[i];

sort(deep+1,deep+1+n,com);

int ans=0;

for(int i=k+1;i<=n;i++) ans=max(ans,deep[i]+1);

cout<

}

洛谷 XR 3 核心城市(樹的直徑,樹形dp)

先考慮乙個點。肯定是在樹的直徑的中間rt。樹的直徑就是樹上距離最遠的兩個點的路徑。對於樹的直徑求法,常用的有兩種。兩遍bfs或dfs,從任意乙個點開始,找到距離這個點最遠的點i,再從i開始,找到距離i這個點距離最遠的點j,則i j就是樹的直徑的兩個端點 證明略 樹形dp也可以求。再推廣到n個點。以r...

P5536 XR 3 核心城市(樹的直徑)

x 國有 nn 座城市,n 1n 1 條長度為 11 的道路,每條道路連線兩座城市,且任意兩座城市都能通過若干條道路相互到達,顯然,城市和道路形成了一棵樹。x 國國王決定將 kk 座城市欽定為 x 國的核心城市,這 kk 座城市需滿足以下兩個條件 這 kk 座城市可以通過道路,在不經過其他城市的情況...

TJOI2017 城市(樹的直徑)

從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有...