題意:給出n個卡車,每個卡車的類型是七個字符組成的,一種卡車可以從另一種卡車派生來的,代價是兩種卡車間類型不同字符的個數,求出這n中卡車派生的最小代價,n種車有一 種是開始就有的,n-1種是派生出來的。
思路:因爲剛開始有一種卡車,所以就是加n-1條把所有車連起來,就是最小生成樹了。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int N=2010;
char str[N][10];
int num,f[N];
struct edge
{
int st,ed,w;
}e[N*N];
void addedge(int x,int y,int w)
{
e[num].st=x;e[num].ed=y;e[num].w=w;num++;
}
int cmp(void const *a,void const *b)
{
edge *c,*d;
c=(edge *)a;
d=(edge *)b;
return c->w-d->w;
}
int dis(int i,int j)
{
int k,sum=0;
for(k=0;k<7;k++)
{
if(str[i][k]!=str[j][k])
sum++;
}
return sum;
}
int find(int a)
{
if(a!=f[a])
f[a]=find(f[a]);
return f[a];
}
int main()
{
int i,j,n,x,y,sum;
while(scanf("%d",&n)!=-1&&n)
{
num=0;
for(i=1;i<=n;i++)
{
scanf("%s",str[i]);
for(j=1;j<i;j++)
{
addedge(i,j,dis(i,j));
}
f[i]=i;
}
qsort(e,num,sizeof(e[0]),cmp);
j=1;sum=0;
for(i=0;i<num&&j<n;i++)
{
x=find(e[i].st);
y=find(e[i].ed);
if(x==y)continue;
f[x]=find(y);
sum+=e[i].w;
j++;
}
printf("The highest possible quality is 1/%d.\n",sum);
}
return 0;
}