题目我咋一看, 觉得有点新颖,后来 读题之后 发现又是 最小生成树的 例子。
题目大意:每条字符串 都可以 由其他的字符串 演化出来。定义两个字符串之间的距离,就是它们之间不同的字符的个数。 要求的是, 如何演化,对应的距离之和 最短,相应的 倒数也就是 最大的。我们知道,最小生成树的权值之和是最短的。
因为这道题,点的范围是 2~2000,并且构成的图 应该是 密集型的,每两个点之间 都会有 边相连,所以我选择 Prim算法
#include <iostream> using namespace std; #define MAX 2010 int n; int map[MAX][MAX]; int vis[MAX]; void Prim(){ int i,j,k,dis[MAX]; k = 0; for(i=0;i<n;i++){ dis[i] = map[0][i]; vis[i] = 0; } for(i=1;i<=n;i++){ int temp = 10; for(j=0;j<n;j++){ if(!vis[j]&&dis[j]<temp){ temp = dis[j]; k = j; } } vis[k] = 1; for(j=0;j<n;j++){ if(!vis[j]&&dis[j]>map[k][j]) dis[j] = map[k][j]; } } for(i=0;i<n;i++) dis[0] += dis[i]; cout<<"The highest possible quality is 1/"<<dis[0]<<"."<<endl; } int main(){ int i,j,k; char str[MAX][7]; while(cin>>n,n){ for(i=0;i<n;i++){ cin>>str[i]; } for(i=0;i<n;i++){ for(j=i;j<n;j++){ int count = 0; for(k=0;k<7;k++){ if(str[i][k]!=str[j][k]) count++; } map[i][j] = map[j][i] = count; } } Prim(); } return 0; }