要使派生方案的优劣值最大,分母的值肯定取到最小。另外,要考虑到所有类型对(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.