HDU3721 列舉 最長路

2022-05-02 21:36:07 字數 1715 閱讀 2121

題意:給你一顆n個節點n-1條邊的樹,每條邊都有乙個權值,現在讓你任意移動一條邊然後把這條邊連線到任意兩個點上,最後問你怎樣移動才能使樹上相距最遠的兩個點距離最小。

思路:先求出樹的最長路,然後列舉移動最長路上的所有邊,移走這條邊後,原樹必定分為不連線的兩顆子樹,分別求這兩顆子樹的最長路,然後分別找到兩顆子樹最長路上靠近中點的點,把這兩個點連上剛剛從母樹移走的邊,再求一遍母樹最長路,比較所有結果取最優解即可。

注意每次列舉移動後都要把圖復原然後繼續列舉。

1

#pragma comment(linker, "/stack:1024000000,1024000000")

2 #include 3 #include 4 #include 5 #include 6 #include 7

using

namespace

std;89

const

int maxn=2555;10

const

int oo=0x3fffffff;11

int visit[maxn], pre[10*maxn];

12int reach[10*maxn], flow[10*maxn], head[maxn], next[10*maxn];

13int stack[10*maxn], sa[10*maxn], sb[10*maxn];

14int color[10*maxn];

15int

st, sd, ans, edge;

1617

struct

node18;

22 queueq;

2324 inline void addedge(int u, int v, int

c)25

2930

void bfs(int ss,int

op)31

58q.push(s);59}

60}61}

62 ++op;

63if(op==1

) bfs(st,op);

64else ans=maxx;65}

6667

int cal(int s, int n, double len) ///

找最靠近中點的點

6878}79

}8081int solve(int

n)82

109return

min;

110}

111112

intmain()

113127

int tmp=solve(n);

128 printf("

case %d: %d\n

",++tcase,tmp);

129}

130}

131/*

13210

1339

1340 1 1

1351 2 1

1362 3 1

1372 4 1

1380 5 1

1395 6 1

1405 7 1

1417 8 1

1424

1430 1 2

1441 2 2

1452 3 2

1465

1470 1 1

1481 2 2

1492 3 3

1503 4 4

151*/

view code

HDU3721 列舉 最長路

題意 給你一顆n個節點n 1條邊的樹,每條邊都有乙個權值,現在讓你任意移動一條邊然後把這條邊連線到任意兩個點上,最後問你怎樣移動才能使樹上相距最遠的兩個點距離最小。思路 先求出樹的最長路,然後列舉移動最長路上的所有邊,移走這條邊後,原樹必定分為不連線的兩顆子樹,分別求這兩顆子樹的最長路,然後分別找到...

hdu 1692 列舉 剪枝

題意 給你一些井的資訊,井中原有的水,當井中的水滿足一定量後會被破壞並且這些水全部流入下乙個井中,用多少能量能直接破壞這個井。然後問要想破壞第n口井至少要多少能量。解題思路 這題首先是要找到從哪口井開始破壞,因為要破壞第n口井,要麼直接破壞n,要麼n之前有連續的幾口井一同被破壞,如果中間出現了乙個不...

完數(hdu1406)列舉

problem description 完數的定義 如果乙個大於1的正整數的所有因子之和等於它的本身,則稱這個數是完數,比如6,28都是完數 6 1 2 3 28 1 2 4 7 14。本題的任務是判斷兩個正整數之間完數的個數。input 輸入資料報含多行,第一行是乙個正整數n,表示測試例項的個數,...