题意:给你n个编码,求具有最高优劣值的派生方案。就是求最小生成树。
思路:求出所有编码间的距离,prim解之。
代码:
#include <iostream>
#include <cstdio>
#include <climits>
#include <string>
using namespace std;
const int maxn = 2005;
int n;
string a[maxn];
int edge[maxn][maxn];
int lowcost[maxn];
int Dis(string &a, string &b){
int cnt = 0;
for(int i = 0; i < 7; i++)
if(a[i] != b[i])
cnt++;
return cnt;
}
bool Input(){
cin>>n;
if(n == 0)
return false;
for(int i = 0; i < n; i++){
cin>>a[i];
}
return true;
}
void Convert(){
for(int i = 0; i < n-1; i++){
for(int j = i+1; j < n; j++){
edge[i][j] = edge[j][i] = Dis(a[i],a[j]);
}
}
}
int prim(int u){
int sum = 0;
for(int i = 0; i < n; i++){
lowcost[i] = edge[u][i];
}
lowcost[u] = -1;
for(int i = 0; i < n-1; i++){
int min = INT_MAX;
int v;
for(int j = 0; j < n; j++)
if(lowcost[j] != -1 && lowcost[j] < min){
v = j; min = lowcost[j];
}
sum += lowcost[v];
lowcost[v] = -1;
for(int j = 0; j < n; j++){
if(edge[v][j] < lowcost[j])
lowcost[j] = edge[v][j];
}
}
return sum;
}
int main(){
while(Input()){
Convert();
printf("The highest possible quality is 1/%d.\n",prim(0));
}
return 0;
}