#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge
{
int row;
int column;
int value;
Edge()
{}
Edge( int a, int b, int c )
:row(a),column(b),value(c)
{}
};
bool operator<( Edge const& Itema, Edge const& Itemb )
{
return Itema.value> Itemb.value;
}
vector<Edge> graph;
int visite[2001];
char ch[2001][8];
int find( int x )
{
if ( x!= visite[x] )
return find( visite[x] );
return x;
}
int distance( char str1[8], char str2[8] )
{
int num= 0;
for ( int i= 0; i< 8; ++i )
if ( str1[i]!= str2[i] )
num++;
return num;
}
int main()
{
int n;
while ( scanf("%d",&n), n )
{
for ( int i= 0; i< n; ++i )
scanf("%s",ch[i] );
graph.reserve ( n+ 1 );
for ( int i= 0; i< n; ++i )
{
for ( int j= 0; j< i; ++j )
graph.push_back ( Edge( j,i,distance( ch[i], ch[j] ) ) );
visite[i]= i;
}
make_heap( graph.begin (), graph.end () );
int sum= 0;
int num= 1;
while ( num< n )
{
int u,v;
if ( (u= find(graph[0].column))!= (v= find(graph[0].row ) ) )
{
sum+= graph[0].value;
visite[v]= u;
num++;
}
pop_heap( graph.begin (), graph.end () );
graph.pop_back ();
}
printf( "The highest possible quality is 1/%d.\n", sum );
graph.clear ();
}
return 0;
}
posted on 2008-11-06 12:00
Darren 阅读(230)
评论(3) 编辑 收藏 引用