题目链接
https://cn.vjudge.net/contest/245639#problem/E
题目大意
题意杀.... 一开始看不懂题目讲的是什么意思, 百度以下才理解的, 意思是说 两个字符串中不同字符的个数就是这两个字符串的距离, 例如
4
aaaaaaa ---- 编号1
baaaaaa ---- 编号2
abaaaaa ---- 编号3
aabaaaa ---- 编号4
编号1和编号2第1个字符不同, 且仅有1个不同 ,所以 编号1到编号2的距离为1
编号2和编号3第1个和第2个字符不同, 且仅有2个不同, 所以编号2到编号3的距离为2
以此类推....
题目分析
采用kruskal, 比具备三大要素, e[i].from, e[i].to, e[i].val, 这里的e[i].val 指的就是字符串中不同字符的个数
代码示例
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#define N 2000
using namespace std;
const int maxn = N*(N-1)/2+5;
int per[N],n,m,s,res;
char ss[N][10];
struct node{ int from, to, val; }e[maxn];
bool cmp(node a, node b){ return a.val < b.val; }
int find(int x){ return per[x] == x ? x : per[x] = find(per[x]); }
void init()
{
for (int i = 1; i <= n; i++) per[i] = i;
}
void input()
{
for (int i = 1; i <= n; i++)
{
getchar();
scanf("%s", ss[i]);
}
}
void datastand()
{
m = 0;
for (int i = 1; i < n; i++)
for (int j = i+1; j <= n; j++)
{
int num = 0;
for (int k = 0; k <= 6;k++)
if (ss[i][k] != ss[j][k]) num++; //统计两两字符串不同字符的个数
e[m].from = i;
e[m].to = j;
e[m++].val = num;
}
/*for (int i = 0; i < m; i++)
cout << e[i].from << ' ' << e[i].to << ' ' << e[i].val << endl;*/
sort(e, e + m, cmp);
}
void kruskal()
{
res = 0;
for (int i = 0; i < m; i++)
{
int fa = find(e[i].from), fb = find(e[i].to);
if (fa!=fb)
{
per[fa] = fb;
res += e[i].val;
}
}
printf("The highest possible quality is 1/%d.\n", res);
}
int main()
{
while (cin >> n, n)
{
init();
input();
datastand();
kruskal();
}
return 0;
}