//n个字符串 由任意一个转化为另一个
// 全部转化需要的最小操作数为分子 即代码中的sum
# include <stdio.h>
# include <algorithm>
# include <math.h>
using namespace std;
# define inf 0x7fffffff
int dis[2010][2010];
int n;
void prim()//prim模板
{
int i,min_i,min,j,vis[2010],low[2010],sum;
for(i=0;i<n;i++)
low[i]=dis[i][0];
memset(vis,0,sizeof(vis));
vis[0]=1;
sum=0;
for(i=1;i<n;i++)
{
min_i=i;
min=inf;
for(j=1;j<n;j++)
{
if(!vis[j]&&low[j]<min)//先找与0相连里的最短距离
{
min=low[j];
min_i=j;
}
}
if(min==inf)
break;
sum+=min;
vis[min_i]=1;
for(j=1;j<n;j++)
{
if(!vis[j]&&low[j]>dis[min_i][j])//在0和与好到的min_i点中取最短的low[]
low[j]=dis[min_i][j];
}
}
printf("The highest possible quality is 1/%d.\n",sum);//注意末尾句号
}
int main()
{
char a[2010][10];
int a1[2010][10];
int i,j,k;
while(~scanf("%d",&n),n)
{
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
for(k=0;k<7;k++)
{
a1[i][k]=a[i][k]-'a';
}
}
memset(dis,0,sizeof(dis));
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
for(k=0;k<7;k++)
if(a1[i][k]!=a1[j][k])//不相等 dis++//一次变化一个位置
dis[i][j]++;
dis[j][i]=dis[i][j];
}
}
prim();
}
return 0;
}
poj 1789 Truck History(prim模板题)
最新推荐文章于 2023-01-10 18:14:39 发布