比赛 HAOI2009 模拟试题1 评测结果 ATTEEEEEEE
题目名称 洞窟探索 最终得分 10
用户昵称 BYVoid 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2009-04-21 11:17:12
显示代码纯文本
/* 
 * Problem: HAOI2008 hole
 * Author: Guo Jiabao
 * Time: 2009.4.20 11:16
 * State: Done
 * Memo: 搜索
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
const int MAXN=151,MAXM=101;
using namespace std;
struct edge
{
	edge *next;
	int t,w;
}ES[MAXN*2],*V[MAXN];
int N,M,Dist[MAXN][MAXN],EC;
int Q[MAXN],use[MAXN],Ans=0x7FFFFFFF;
double As;
inline void addedge(int a,int b,int w)
{
	ES[++EC].next=V[a];
	V[a]=ES+EC; V[a]->t=b; V[a]->w=w;
}
void init()
{
	int i,a,b,c;
	freopen("hole.in","r",stdin);
	freopen("hole.out","w",stdout);
	scanf("%d%d",&N,&M);
	for (i=1;i<=N-1;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		addedge(a,b,c);
		addedge(b,a,c);
	}
	memset(Dist,-1,sizeof(Dist));
}
void bfs(int p)
{
	int head=0,tail=-1,i,j;
	Q[++tail]=p;
	Dist[p][p]=0;
	while (head<=tail)
	{
		i=Q[head++];
		for (edge *e=V[i];e;e=e->next)
		{
			j=e->t;
			if (Dist[p][j]==-1)
			{
				Dist[p][j]=Dist[p][i]+e->w;
				Q[++tail]=j;
			}
		}
	}
}
void dfs(int k)
{
	int i,j;
	if (k>M)
	{
		int A=0;
		for (i=1;i<=M;i++)
		{
			for (j=i+1;j<=M;j++)
			{
				int a=use[i],b=use[j];
				A+=Dist[a][b];
			}
		}
		if (A<Ans)
			Ans=A;
	}
	else
	{
		for (i=use[k-1]+1;i<=N;i++)
		{
			use[k]=i;
			dfs(k+1);
		}
	}
}
void solve()
{
	int i;
	for (i=1;i<=N;i++)
		bfs(i);
	use[0]=0;
	dfs(1);
	double sum=(double)M*(M-1)/2.0;
	As=Ans / sum;
}
int main()
{
	init();
	solve();
	printf("%.2lf\n",As);
	return 0;
}