过年了,写点水题熟练算法的使用,开心开心。
题意:求最小生成树,这里的距离等于两字符串相异字符的个数。
思路:prim算法求最小生成树。
#include <cstdio>
#include <cstring>
#define F(_i,_u) for(int _i=0;_i<(_u);_i++)
#define MO 1061109567
using namespace std;
//string
char s[2005][10];
// 是否在树内
bool in[2005];
//非树结点到树结点的最小距离
int dist[2005];
//计算字符串距离的内联函数
inline int cal(int x,int y){
int cals=0;
F(i,7)if(s[x][i]!=s[y][i])cals++;
return cals;
}
int main(){
//min:非树结点到树结点的最小距离,mini:对应的非树结点
//cals:计算距离函数的返回值
int n,ans,min,mini,cals;
while(~scanf("%d",&n)&&n){
//初始化
ans=0;
memset(dist,0x3f,sizeof(dist));
memset(vis,0,sizeof(in);
F(i,n)scanf("%s",s[i]);
//mini初始化为0(即create第一个树结点)
ans=mini=0;
F(i,n){
//更新到树的最小距离
F(j,n)if(!in[j]&&(cals=cal(mini,j))<dist[j])dist[j]=cals;
//寻找到树的最小距离
min=MO;
F(j,n)if(!in[j]&&dist[j]<min)min=dist[mini=j];
vis[mini]=1;
ans+=min;
}
printf("The highest possible quality is 1/%d.\n",ans);
}
}