洛谷P1099 樹網的核

2022-03-17 15:55:52 字數 1333 閱讀 7280

題目

對於這種題目描述比較長的題,可以考慮簡化題意。

簡化後的題意:

給定一棵帶邊權無根樹

在其直徑上求出一段長度不超過s的路徑f,

使得離路徑距離最遠的點到路徑的距離最短。求最短距離。

根據題目範圍,直接暴力floyd求多源最短路徑。然後\(n^2\)求出直徑和直徑端點。搜尋求出直徑上的點。然後再暴力找出所有路徑,和離每條路徑最遠的距離。其實就是一道模擬題。

#include using namespace std;

int n, s, cnt, tot;//tot代表總的直徑個數

int dis[3010][3010], lin[3010], maxn, maxk1, maxk2;

int pos[10100], vis[3010], d[3010];// vis[i]表示是否被訪問過 //pos[i][j]表示i直徑的第j個

struct edg

e[401001];

inline void add(int f, int t, int l)

int dfs(int id, int now, int to)

for (int i = lin[now]; i; i = e[i].nex) }

return 0;

}int main()

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

dis[i][i] = 0;

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

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

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

dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);

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

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

if (dis[i][j] > maxn && dis[i][j] != 214748 && i != j)

maxn = dis[i][j], maxk1 = i, maxk2 = j;

dfs(1, maxk1, maxk2);

int minn = 2147483647;

int le = maxk2, ri = maxk1;//直徑的左端點,右端點

for (int r = 1; r <= pos[0]; r++)

for (int l = 1; l <= pos[0]; l++)//必在直徑上

printf("%d", minn);

return 0;

}

洛谷 P1099 樹網的核

設t v,e,w t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊到有正整數的權,我們稱tt為樹網 treebetwork 其中vv,ee分別表示結點與邊的集合,ww表示各邊長度的集合,並設tt有nn個結點。路徑 樹網中任何兩結點aa,bb都存在唯一的一條簡單路徑,用d a,b d a...

洛谷 P1099 樹網的核 題解

樓上的大佬似乎都用的dfs,像我這種蒟蒻只會用暴力的floyd演算法。不過,看到這道題規模只有300,floyd演算法不會有問題。首先用floyd演算法預處理點對之間的距離,接下來窮舉每一對點構成的路徑 假裝每一條路徑就是樹網的核 如果路徑長 s,則計算其它點到該路徑的最大距離,取窮舉到的所有路徑中...

P1099 樹網的核

這裡是o n 2 的做法 首先可以證明,對於每一條直徑,求出的偏心距是一樣的 怎麼證明?顯然 我不會 怎樣求樹的直徑?簡單。貪心 在一條直徑上,顯然選擇的路徑越長越好 實現 首先求出樹上所有點之間的距離 n 2 一直dfs就行 然後找出直徑及直徑經過的點 最後在直徑上貪心的取即可 include i...