【題解】P1099 樹網的核
阿新 • • 發佈:2020-08-29
P1099 樹網的核
已知i到j是一條路徑,求k到這條路徑的距離
$ ans = (dis[i][k] + dis[i][k] - dis[i][j] ) / 2 $
亂搞
300資料亂搞之——最短路求解直徑
300資料亂搞之——n^3的最短路求法 求 n的唯一路徑求法
300資料亂搞之——n^2列舉路徑F
300資料亂搞之——AC
300資料亂搞程式碼:
#include<cmath> #include<queue> #include<cstdio> #include<string> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define inf 0x3fffffff using namespace std; int n, s, G[310][310], dis[310][310], u, v, k, ans; int main(){ cin >> n >> s; memset(dis, 0x3f, sizeof(dis)); for(int i = 1; i < n; i++){ dis[i][i] = 0; scanf("%d%d%d", &u, &v, &k); G[u][v] = G[v][u] = k; dis[u][v] = dis[v][u] = k; } dis[n][n] = 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]); } } ans = 1061109567; for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(dis[i][j] <= s){ int maxlen = 0; for(int k = 1; k <= n; k++){ maxlen = max(maxlen, (dis[i][k] + dis[j][k] - dis[i][j]) / 2); } ans = min(ans, maxlen); } } } cout << ans << endl; return 0; }