题意:给出n个长度为7的字符串,每个字符串代表一个车,定义车的距离是两个字符串间不同字母的个数,题目要求的数不同的车的距离的最小值,即所求的就是最小生成树
注意cin 会超时
#include <iostream> #include <memory.h> #include <string> #include <stdio.h> #define IN (1<<28) using namespace std; int kase,N; int G[2005][2005]; int locost[2005], visited[2005]; int cost; char trucks[2005][7]; void prime() { for( int i = 1; i <= N; i++ ) locost[i] = G[1][i]; locost[1] = 0; visited[1] = 1; int cnt = 0; while( cnt != N - 1 ) { int MinV = 0, Min = IN; for( int i = 1; i <= N; i++ ) if( locost[i] && locost[i] < Min ) { MinV = i; Min = locost[i]; } if( !MinV ) break; cost += Min; cnt++; locost[MinV] = 0; for( int i = 1; i <= N; i++ ) { if( locost[i] && locost[i] > G[MinV][i] ) locost[i] = G[MinV][i]; } } } int dis( char * a, char * b ) { int distance = 0; for( int i = 0; i < 7; i++ ) { if( a[i] != b[i] ) distance++; } return distance; } int main() { while( cin >> N, N) { for( int i = 1; i <= N; i++ ) scanf("%s", trucks[i] ); for( int i = 1; i <= N; i++ ) for( int j = 1; j <= N; j++ ) { G[i][j] = dis( trucks[i], trucks[j] ); } memset( locost, 0, sizeof(locost) ); memset( visited, 0, sizeof(visited) ); cost = 0; prime(); printf("The highest possible quality is %d/%d.\n", 1, cost); } return 0; }