
//poj 1789 Truck History //MST(minimum spanning tree) //It's mean is: there is several type of truck and every truck //is marked by a string with 7 lowercase character //and distance between two truck is the number of differnt character //between two string #include <stdio.h> #include <string.h> #define N 2005 #define INF 1 << 30 int n; int map[N][N], dis[N], ans; char type[N][9]; bool vis[N]; void prim() { for(int i = 0; i < n; ++i) { dis[i] = INF; vis[i] = false; } dis[0] = 0; while(1) { int now = -1, min = INF; for(int i = 0; i < n; ++i) { if(min > dis[i] && vis[i] == false) { min = dis[i]; now = i; } } if(now == -1) break; ans += min; //accumulate the answer vis[now] = true; //have been visited for(int i = 0; i < n; ++i) if(vis[i] == false && dis[i] > map[now][i]) dis[i] = map[now][i]; } } int main() { //freopen("in.txt", "r", stdin); while(scanf("%d", &n), n) { ans = 0; memset(map, 0, sizeof(map)); for(int i = 0; i < n; ++i) { scanf("%s", type[i]); for(int j = 0; j < i; ++j) { int dist = 0; for(int k = 0; k < 7; ++k) if(type[i][k] != type[j][k]) dist++; map[i][j] = map[j][i] = dist; //build map } } prim(); printf("The highest possible quality is 1/%d.\n", ans); } return 0; }