比赛 HAOI2009 模拟试题1 评测结果 C
题目名称 洞窟探索 最终得分 0
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-03-25 20:54:34
显示代码纯文本
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN=1505,MAXM=1005;
const int oo=0x7fffffff/2;

struct Node
{
	int v,w;
	Node *next;
	Node (int _v,int _w,Node *_next):
		v(_v),w(_w),next(_next){}
}*adj[MAXN];

inline void addedge(int u,int v,int w)
{
	adj[u]=new Node(v,w,adj[u]);
	adj[v]=new Node(u,w,adj[v]);
}

int c[MAXN][2],w[MAXN][2];
bool vis[MAXN];
void bfs()
{
	queue<int> q;
	q.push(1);
	vis[1]=true;
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(Node *p=adj[u];p;p=p->next)
			if (!vis[p->v])
			{
				vis[p->v]=true;
				if (c[u][0]==0)
				{
					c[u][0]=p->v;
					w[u][0]=p->w;
				}
				else 
				{
					c[u][1]=p->v;
					w[u][1]=p->w;
				}
				q.push(p->v);
			}
	}
}

int N,M;
int d[MAXN][MAXM];
void dp(int u)
{
	if (u==0)
		return ;	
	for(int i=2;i<=M;i++)
		d[u][i]=oo;
	dp(c[u][0]);
	dp(c[u][1]);
	for(int i=2;i<=M;i++)
		for(int j=0;j<i;j++)
			d[u][i]=min(d[u][i],d[c[u][0]][j]+d[c[u][1]][i-j-1]
								+w[u][0]*j*(M-j)+w[u][1]*(i-j-1)*(M-i+j+1));
}

int main()
{
	freopen("hole.in","r",stdin);
	freopen("hole.out","w",stdout);
	scanf("%d%d",&N,&M);
	for(int i=0;i<N-1;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		addedge(u,v,w);
	}
	bfs();
	for(int i=1;i<=M;i++)
		d[0][i]=oo;	
	dp(1);
	printf("%.3f\n",double(d[1][M])/M);
	re