题意:给出一组truck的代号(每个代号是长度为7的字符串),规定两个代号之间的distance是不同的字母个数。将每个代号视作点,代号之间distance视作边权,题意就是要求该图的最小生成树
题解:
#include <iostream>
using namespace std;
#define INF 0x3fffffff
int dis[2001],map[2001][2001];
char truck[2001][7];
bool check[2001];
int n;
int prim()
{
int i, j, k, min, sum = 0;
memset(check,false,sizeof(check));
for ( i = 0; i < n; i++ )
dis[i] = INF;
dis[0] = 0;
for ( i = 0; i < n; i++ )
{
min = INF;
for ( j = 0; j < n; j++ )
{
if ( !check[j] && dis[j] < min )
{
k = j;
min = dis[j];
}
}
sum += min;
check[k] = true;
for ( j = 0; j < n; j++ )
{
if ( !check[j] && map[k][j] < dis[j] )
dis[j] = map[k][j];
}
}
return sum;
}
int main()
{
int i, j, k;
while ( scanf("%d",&n) && n )
{
for ( i = 0; i < n; i++ )
scanf("%s", truck[i]);
memset(map,0,sizeof(map));
for ( i = 0; i < n-1; i++ )
{
for ( j = i+1; j < n; j++ )
for ( k = 0; k < 7; k++ )
if ( truck[i][k] != truck[j][k] )
map[i][j] = (++map[j][i]);
}
printf("The highest possible quality is 1/%d.\n", prim());
}
return 0;
}