题意:给出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; }