#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include<algorithm>
using namespace std;
int fa[2005];
char s[2020][10];
struct Edge{
int x,y,val;
}edge[4000050];
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
bool same(int x,int y){
return find(x)==find(y) ;
}
void bind(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fx]=fy;
}
bool cmp(Edge a,Edge b){
return a.val<b.val;
}
int main()
{
int n,ans,cnt,k;
while(scanf("%d",&n)!=EOF&&n!=0){
k=0;
ans=0;
for(int i=1;i<=n;i++)
scanf("%s",s[i]);//每个字符串默认从0开始
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
cnt=0;
for(int t=0;t<7;t++){
if(s[i][t]!=s[j][t])
cnt++;
}//将题目转换 计算距离 处理成结构体的形式
edge[k].x=i;
edge[k].y=j;
edge[k].val=cnt;
k++;
}
}
for(int i=1;i<=n;i++)
fa[i]=i;
sort(edge,edge+k,cmp);
//克鲁斯卡尔
for(int i=0;i<k;i++)
if(!same(edge[i].x,edge[i].y)){
bind(edge[i].x,edge[i].y);
ans+=edge[i].val;
}
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}
题目链接https://cn.vjudge.net/problem/POJ-1789
题意:
给出n个长度为7的字符串,
每个字符串代表一个车,
两个字符串间不同字母的个数为车的距离,
题目要求的数不同的车的距离的最小值,
即所求的就是最小生成树
思路:
开始先求出距离(即相同位置的不同字母的个数)
就是 每2行之间找出来他们有几处不同,代表他们的距离,比如第一行和第二行是有一个字母不同,然后第一行和第二行之间的距离就是1,类比 1,3是1 1,4是1 2,3是2 2,4是2 3,4是2 把这四行都连接起来的最短距离就是3,就是1和2,1和3,1和4,这样1,2,3,4就都连接起来了然后把所有的行连接起来需要的最短距离就是Q