比赛 |
HAOI2009 模拟试题1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
洞窟探索 |
最终得分 |
100 |
用户昵称 |
ybh |
运行时间 |
0.000 s |
代码语言 |
Pascal |
内存使用 |
0.00 MiB |
提交时间 |
2011-03-25 21:17:24 |
显示代码纯文本
- program hole;
- type
- dian=record
- first,vdata:longint;
- end;
- bian=record
- v,next,w:longint;
- end;
- dptree=record
- left,right,lw,rw,vdata:longint;
- end;
-
- var
- list:array[0..1500] of dian;
- map:array[0..3000] of bian;
- tree:array[0..1500] of dptree;
- f:array[0..1500,0..1000] of longint;
- b:array[0..1500] of boolean;
- n,m,i,j,r1,r2,r3,ans:longint;
-
- function max(x,y:longint):longint;
- begin
- if x>y
- then max:=x
- else max:=y;
- end;
-
- function min(x,y:longint):longint;
- begin
- if x<y
- then min:=x
- else min:=y;
- end;
-
- procedure maketree(v:longint);
- var
- i:longint;
- begin
- tree[v].vdata:=1;
- i:=list[v].first;
- while i<>0 do
- begin
- if b[map[i].v]=false then
- begin
- if tree[v].left=0 then
- begin
- tree[v].left:=map[i].v;
- tree[v].lw:=map[i].w;
- b[map[i].v]:=true;
- maketree(map[i].v);
- tree[v].vdata:=tree[v].vdata+tree[tree[v].left].vdata;
- end
- else
- begin
- tree[v].right:=map[i].v;
- tree[v].rw:=map[i].w;
- b[map[i].v]:=true;
- maketree(map[i].v);
- tree[v].vdata:=tree[v].vdata+tree[tree[v].right].vdata;
- end;
- end;
- i:=map[i].next;
- end;
- end;
-
- function dp(i,j:longint):longint;
- var
- i1,num1:longint;
- begin
- if (tree[i].vdata=1) or (j=0) then exit(0);
- if f[i,j]<>-1 then exit(f[i,j]);
-
- if tree[i].right=0 then
- begin
- f[i,j]:=dp(tree[i].left,j-1)+(j-1)*(m-(j-1))*tree[i].lw;
- end
- else
- begin
- f[i,j]:=maxlongint;
- for i1:=max(0,j-tree[tree[i].right].vdata-1) to min(j-1,tree[tree[i].left].vdata) do
- begin
- if i1>tree[tree[i].left].vdata then continue;
- if j-1-i1>tree[tree[i].right].vdata then continue;
- num1:=dp(tree[i].left,i1)+i1*(m-i1)*tree[i].lw
- +dp(tree[i].right,j-1-i1)+(j-1-i1)*(m-(j-1-i1))*tree[i].rw;
- if num1<f[i,j] then f[i,j]:=num1;
- end;
- end;
- dp:=f[i,j];
- end;
-
- begin
- assign(input,'hole.in');
- reset(input);
- assign(output,'hole.out');
- rewrite(output);
-
- readln(n,m);
- for i:=0 to n do
- for j:=0 to m do
- f[i,j]:=-1;
- fillchar(list,sizeof(list),0);
- for i:=1 to n-1 do
- begin
- readln(r1,r2,r3);
-
- map[i*2-1].v:=r2;
- map[i*2-1].w:=r3;
- map[i*2-1].next:=list[r1].first;
- list[r1].first:=i*2-1;
- inc(list[r1].vdata);
-
- map[i*2].v:=r1;
- map[i*2].w:=r3;
- map[i*2].next:=list[r2].first;
- list[r2].first:=i*2;
- inc(list[r2].vdata);
- end;
-
- fillchar(b,sizeof(b),false);
- b[1]:=true;
- maketree(1);
-
- fillchar(f,sizeof(f),$FF);
- ans:=dp(1,m);
- writeln(ans/(m*(m-1)/2):0:2);
-
- close(input);
- close(output)
- end.
-