題中給出了鄰接矩陣,而且 n 比較小,可以先考慮 floyd 那樣的做法
一些三個點組成的點集他們之間的關係是滿足 dst[i][j] = dst[i][k] + dst[k][j]
這些點的位置關係是可以先確定下來的
但是有些點之間的距離連出來會不一樣,甚至還有些點加不到圖中
考慮加入了圖中但是距離不對的點,他們中間一定至少有個中轉點
而在其他點的距離都計算正確的情況下,
列舉所有點作為中轉點後取最小值
最小值一定是距離不正確的點對中的乙個點(設為 k)向上連線的邊長
用這個式子計算:val = (dst[i][j] + dst[j][k] + dst[k][i]) / 2 - dst[i][j]
簡(hu)單(luan)證明一下就是如果最小值不是我們想要的東西的話
那一定是乙個較大的值,而存在較小值一定是較大值是較大值多走了一條/些邊
(自己畫一條鏈計算端點的值隨便找幾個點試一下就發現了)
感覺菊花圖沒法做,像是這樣:
其實這種時候隨意找兩個點,他們之間的距離是正確的
再按照上面的計算方式是可以計算的
具體在實現的時候,發現他可以像 floyd 差不多寫
只要把他之前加入的都算上求最小值就行,
順序講道理是無所謂的只要把他和其他的都計算一遍就好
為了方便就從 1 到 n 依次加入了
**:
#include #include #include #include #include #include using namespace std;const int max_n = 35;
int n, ans;
int dst[max_n][max_n];
int main()
}ans = dst[1][2];
for (int k = 3; k <= n; ++k)
}ans += cur_ans;
}printf("%d\n", ans);
}return 0;
}
luogu P1268 樹的重量
一開始把這題想複雜了,這裡記 di i j 表示 i 到 j 的距離 首先如果 n 2 答案顯然為 di 1 2 如果 n 3 懶得畫圖了盜圖過來 那麼3號點會從1,2號點的路徑上伸出去,相比較 n 2 答案多出了 frac n 4 的情況 如果把4看做從1,2號點路徑上伸出去的,那麼答案 紅色部分...
p1268 樹的重量
傳送門 題目 樹可以用來表示物種之間的進化關係。一棵 進化樹 是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的 進化樹 令n 用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足 對於任意的i,j,k,有m i,j m ...
luogu P1268 樹的重量
嘟嘟嘟 一道非常好的構造題。我反正是一點思路都沒有,最後還是看了題解。假如n 2,那麼樹的重量就是di,j。然後n 3,畫乙個圖 則重量 d1,3 d2,3 d1,2 2。n 4同理 加上的應該是 d1,4 dj,4 d1,j 2 j 4 的最小值,這裡面j 3。因為如果不是最小值的話,比如 j 2...