1. 程式人生 > 實用技巧 >【題解】P1099 樹網的核

【題解】P1099 樹網的核

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;
}