構造類題目,看不出個所以然來。。。
emmm,只好看題解:
只有兩個點,那一條路徑就是$ans$
考慮三個點,那麼$3$這個點相對於樹上的路徑(已經加入樹上的邊的距離)
為:$(dis[1][3]+dis[2][3]-dis[1][2])/2$
秒啊,這樣就可以求出那一條藍邊的長度了
考慮四個點的情況
對於第四個點,我們發現單純只求$(dis[1][4]+dis[2][4]-dis[1][2])/2$得到的答案並不是我們想要的,重複了一部分
轉而考慮$3$,那麼$(dis[1][3]+dis[3][4]-dis[1][3])/2$這樣得到的答案才是我們所想要的
那麼對於每個點加入樹上的邊的答案為
$min((dis[1][i]+dis[j][i]-dis[1][j])/2)$
#includeusingnamespace
std;
int d[30][30
],n;
intmain()
int sum=d[1][2
];
for(int i=3;i<=n;i++)
sum+=tmp;
}printf(
"%d\n
",sum);
}return0;
}
洛谷 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為要插入的節點...