POJ 1789[Truck History]
要使派生方案的优劣值最大,分母的值肯定取到最小。另外,要考虑到所有类型对(t0,td)的距离,使得最终派生方案中每种卡车类型都是由其他一种卡车类型派生出来的(最初的卡车类型除外)。这样,如果将每种卡车类型理解成一个无向网中的顶点,所要求的最佳派生方案就是求最小生成树,而分母就是最小生成树的权值。
这个题我用Kruskal TLE了无数次……最后终于鼓起勇气写了Prim。
Const maxn=2000; Var codes:array[1..maxn,1..10]of char; d:array[1..maxn,1..maxn]of longint; lowcost:array[1..maxn]of longint; i,j,n:longint; Function prim:longint; var i,j,k,dist,sum,min:longint; begin fillchar(d,sizeof(d),0); for i:=1 to n-1 do for j:=i+1 to n do begin dist:=0; for k:=1 to 7 do if codes[i,k]<>codes[j,k] then inc(dist); d[i,j]:=dist; d[j,i]:=dist; end; sum:=0; lowcost[1]:=-1; for i:=2 to n do lowcost[i]:=d[1,i]; for i:=1 to n-1 do begin min:=maxlongint; for k:=1 to n do begin if (lowcost[k]<>-1)and(lowcost[k]<min) then begin j:=k; min:=lowcost[k]; end; end; sum:=sum+min; lowcost[j]:=-1; for k:=1 to n do if d[j,k]<lowcost[k] then lowcost[k]:=d[j,k]; end; exit(sum); end; BEgin while true do begin readln(n); if n=0 then break; for i:=1 to n do begin for j:=1 to 7 do read(codes[i,j]); readln; end; writeln('The highest possible quality is 1/',prim,'.'); end; End.