【题解】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;
}

posted @ 2020-08-29 11:28  _Buffett  阅读(100)  评论(0编辑  收藏  举报