POJ的题目,读起来真费事,,,意思是给你N串有7个字符的字符串,任意两个字符串的距离就是两个字符串相同位置上不同字符数量之和(如aaaa和baba,第一位和第三位不同,所以距离为2),现在让我们求一个方案,要求所有串都必须由其它串演变而来(除了初始串),要求衍生所需要的总距离。其实就是求最小生成树。
代码:
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 20000
int n,flag[2000],low[2000],map[2000][2000];
char s[2005][8];
void prim(){
int i,j,minn,pos,sum=0;
memset(flag,0,sizeof(flag));
for(i=2;i<=n;i++)low[i]=map[1][i];
for(i=2;i<=n;i++)
{
minn=maxn;
for(j=2;j<=n;j++)
if(!flag[j]&&low[j]<minn){minn=low[j];pos=j;}
sum+=minn;
// cout<<minn<<endl;
flag[pos]=1;
for(j=2;j<=n;j++)
if(!flag[j]&&map[pos][j]<low[j])
low[j]=map[pos][j];
}
cout<<"The highest possible quality is 1/"<<sum<<"."<<endl;
return;
}
int main(){
int i,j,k,sum;
while(cin>>n&&n)
{
for(i=1;i<=n;i++)cin>>s[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
for(k=0,sum=0;k<=6;k++){if(s[i][k]-s[j][k]==0)continue;sum++;}
map[i][j]=sum;
//cout<<i<<" "<<j<<" "<<sum<<endl;
}
prim();
}
}