1. 程式人生 > 其它 >P1099 [NOIP2007 提高組] 樹網的核(暴力)

P1099 [NOIP2007 提高組] 樹網的核(暴力)

暴力列舉兩個端點,BFS算偏心距。

有O(n)的做法,跪了

#include<bits/stdc++.h>
using namespace std;
const int maxn=305;
vector<pair<int,int> > g[maxn];
int n,s;
int vis[maxn],ins[maxn],d[maxn],Min=1e9;
void dfs (int x,int f,int dep) {
	//確定y列舉x
	if (dep>s) return;
	ins[x]=1;
	queue<int> q;
	int Max=0;
	for (int i=1;i<=n;i++) vis[i]=0;
	for (int i=1;i<=n;i++) {
		if (ins[i]) {
			q.push(i);
			vis[i]=1;
			d[i]=0;
		}
	}
	while (q.size()) {
		int u=q.front();
		q.pop();
		for (pair<int,int> it:g[u]) {
			int v=it.first;
			if (vis[v]) continue;
			q.push(v);
			vis[v]=1;
			d[v]=d[u]+it.second;
			Max=max(Max,d[v]);
		}
	}
	Min=min(Min,Max);
	for (pair<int,int> it:g[x]) {
		int y=it.first;
		if (y==f) continue;
		dfs(y,x,dep+it.second);
	}
	ins[x]=0;
}
int main () {
	scanf("%d%d",&n,&s);
	for (int i=1;i<n;i++) {
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back(make_pair(v,w));
		g[v].push_back(make_pair(u,w));
	}
	for (int i=1;i<=n;i++) {
		dfs(i,i,0);
	}
	printf("%d\n",Min);
}