洛谷P1268 樹的重量

2022-03-25 19:14:32 字數 1665 閱讀 6982

這道題是貪心。主要的難點在於合併路徑壓縮長度的策略。這裡採用的方法是讓乙個個結點併入已經構建好的樹中,並記錄該結點接入樹的位置、接入樹到該結點的長度。模擬注意細節即可。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

#define re register

9#define rep(i, a, b) for (re int i = a; i <= b; ++i)

10#define repd(i, a, b) for (re int i = a; i >= b; --i)

11#define maxx(a, b) a = max(a, b);

12#define minn(a, b) a = min(a, b);

13#define ll long long

14#define inf (1 << 30)

1516 inline int

read()

2223

const

int maxn = 30 + 5, maxw = 100 + 5;24

25int

n, m[maxn][maxn], link[maxn][maxw], l[maxn], ans;

2627

intmain()

44while (link[p][q]) p = link[p][q], q = 0

;45 link[p][q] =i;46}

47 ans = 0

;48 rep(i, 2, n) ans +=l[i];

49 printf("

%d\n

", ans);50}

5152

return0;

53 }

將以上方法進行抽象簡化,不再模擬,直接統計即可。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

#define re register

9#define rep(i, a, b) for (re int i = a; i <= b; ++i)

10#define repd(i, a, b) for (re int i = a; i >= b; --i)

11#define maxx(a, b) a = max(a, b);

12#define minn(a, b) a = min(a, b);

13#define ll long long

14#define inf (1 << 30)

1516 inline int

read()

2223

const

int maxn = 30 + 5;24

25int

n, e[maxn][maxn], ans;

2627

intmain()

39 printf("

%d\n

", ans);40}

4142

return0;

43 }

洛谷 P1268 樹的重量

題目描述 樹可以用來表示物種之間的進化關係。一棵 進化樹 是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的 進化樹 令n 用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足 對於任意的i,j,k,有m i,j m j,...

洛谷 P1268 樹的重量()

構造法。鍛鍊思維的好題,需要運用一些樹的性質。以下用g i,j 表示點i與點j之間的距離。首先,我們考慮n 2時的情況,很顯然答案就是g 1,2 接下來考慮n 3時的情況。由於所有點均為葉子節點,很顯然點3是從點1到點2的路徑上分叉出來的,就像下圖。設藍色部分長度為len,那麼答案就是g 1,2 l...

洛谷P1268 樹的重量

因為所有的節點都是葉節點,因此每個葉節點都是從已有的節點中分出來的 而每個節點都可以從 1 j j i 中分出 當然類似於floyd三層迴圈列舉也可以 設i為要插入的節點 j為dis 1 j 中最小的那個 jfloyd的話是 for int i 3 i n i ans minn 其中i為要插入的節點...