TJOI2017 城市(樹的直徑)

2022-04-30 09:36:11 字數 2071 閱讀 7312

從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,《-1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有限,因而小明現在只能對一條高速公路進行改造,改造的方式就是去掉一條高速公路,並且重新修建一條一樣的高速公路(即交通費用一樣),使得這個地區的兩個城市之間的最大交通費用最小(即使得交通費用最大的兩座城市之間的交通費用最小),並且保證修建完之後任意兩座城市相互可達。如果你是小明,你怎麼解決這個問題?

輸入格式:

輸入資料的第一行為乙個整數n,代表城市個數。

接下來的n - 1行分別代表了最初的n-1條公路情況。每一行都有三個整數u,v,d。u,v代表這條公路的兩端城市標號,d代表這條公路的交通費用。

1 <= u,v <= n,1<= d <= 2000

輸出格式:

輸出資料僅有一行,乙個整數,表示進行了最優的改造之後,該地區兩城市 之間最大交通費用。

輸入樣例#1:

51 2 1

2 3 2

3 4 3

4 5 4

輸出樣例#1:

對於30%的資料,1<=n<500

對於100%的資料,1<=n<=5000

感覺這道題挺難碼的.....

看了資料和時間之後大概能猜出是\(o(n^2)\)的演算法。

於是我們直接列舉斷開哪條邊,顯然我們可以直接斷開直徑上的邊,否則答案不會變小。(直徑的所有邊仍然在一條聯通塊中)。

然後整張圖會變成兩棵樹,我最開始的想法,直接在原直徑上找兩個中點,然後將這兩個中點連線起來。但是後來發現這樣連線不一定最優,(自己yy一下,連線到乙個非直徑上的點,這個點連線到原直徑一段的中點,這樣會比上述連線方法更優)。

在考慮到能夠承受\(o(n^2)\)的複雜度,所以我們在兩個聯通塊中跑樹的直徑,然後找中點連線。

注意:中點有可能在邊上,最多需要考慮4個點相連。

#include#define max(a,b) (a)>(b)?(a):(b);

using namespace std;

int read()

while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*w;

}const int n=5010;

int n,cnt,l,r,x,y,z,sum1,sum2,ans1,ans2,ans3,ans4,ans,a1,a2,b1,b2;

int head[n],dis[n],len[n],ff[n],fa[n];

bool vis[n];

struct nodeedge[2*n];

void add(int x,int y,int z)

void dfs(int k,int father)

}void dfs1(int k,int fa,int top)

}int cut(int x,int y)

else if(dis[f]*1.0dis[ll]) ll=i;

for(int i=1;i<=n;i++) dis[i]=ff[i]=0;

dfs1(ll,0,x);

for(int i=1;i<=n;i++) if(dis[i]>dis[rr]) rr=i;

qwe=rr;

while(qwe!=ll)

else if(dis[f]*1.0dis[l]) l=i;

for(int i=1;i<=n;i++)dis[i]=fa[i]=0;

dfs(l,0);

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

if(dis[i]>dis[r]) r=i;

int qwe=r;ans=2000000000;

for(int i=1;i<=n;i++) len[i]=dis[i];

while(fa[qwe])

cout<}

TJOI2017 城市 樹的直徑,貪心

這道題,調了我一晚上.一直80分 考慮到幾點 所以我們先列舉斷開直徑上的邊,然後分別找到斷開後兩棵子樹的直徑.接著我們討論 dis 1,dis 2 最優情況.其 dis 為其到子樹直徑較遠的一端.如果 x 1,x 2 在子樹的直徑上,那麼顯然會更優,因為如果不在直徑上,它還會多出一小段距離.然後就可...

TJOI2017 城市 樹形dp

這是個神仙題,會卡常 題目讓你改一條邊把直徑變得最短。列舉每條邊,會把圖分成兩個地方,兩個連通塊 x區和y區域 都換根dp一下,算出離x最遠的點的距離記為dis x 然後列舉一下 新直徑有三個 1 max dis x x裡面最大的 2 dis y y裡面最大的 3 min dis x dis y l...

TJOI 2017 城市 題解

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