英语考试
(
题目链接)
就是一个最小生成树问题!
先把所有的路径(汉明)打出来存起来
然后走最小生成树!!!
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
char s[1010][15];
int map[1010][1010];
bool book[1010];
int dis[1010];
int n,m,w;
int hanming(char a[],char b[])
{
int sum=0;
for(int i=0;i<m;i++)
{
if(a[i]!=b[i])
{
sum++;
}
}
return sum*w;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&w))
{
int count=0,sum=0;
for(int i=1;i<=n;i++)
{
dis[i]=inf;
}
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=hanming(s[i],s[j]);
if(map[i][j]>m)
map[i][j]=m;
}
}
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)//初始化
dis[i]=map[1][i];
book[1]=1;
count++;
sum=m;
while(count<n)
{
int min=inf;
int dian;
for(int i=1;i<=n;i++)
{
if(!book[i]&&dis[i]<min)
{
min=dis[i];
dian=i;
}
}
book[dian]=1;count++;sum+=dis[dian];
for(int k=1;k<=n;k++)
{
if(book[k]==0&&dis[k]>map[dian][k])
dis[k]=map[dian][k];
}
}
printf("%d\n",sum);
}
}