您的位置:首页 > 编程语言 > C语言/C++

POJ 1789

2015-07-15 10:11 411 查看
最小生成树,题意比较难理解。

建模:

每个字符串可以转化为图上的一点,每两个字符串之间不同的字母的个数可以转化为两点之间的距离,求最小距离即可。

AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxx 2005
int n;
int esum,p[maxx];
struct Edge
{
int u,v,w;
}edge[maxx*maxx/2];
bool cmp(Edge a,Edge b)
{
return a.w<b.w;
}
int findpa(int x)
{
return p[x]==x?x:p[x]=findpa(p[x]);
}
int kruskal()
{
for(int i=1;i<=n;i++)
p[i]=i;
int ans=0,num=0;
sort(edge,edge+esum,cmp);
for(int i=0;i<esum;i++)
{
int p1=findpa(edge[i].u);
int p2=findpa(edge[i].v);
if(p1!=p2)
{
ans+=edge[i].w;
num++;
p[p1]=p2;
}
if(num==n-1)
return ans;
}
return ans;
}
int main()
{
char s[maxx][7];
while(scanf("%d",&n)!=EOF&&n)
{
esum=0;
for(int i=1;i<=n;i++)
scanf("%s",s[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int num=0;
for(int k=0;k<7;k++)
{
if(s[i][k]!=s[j][k])
num++;
}
edge[esum].u=i;
edge[esum].v=j;
edge[esum].w=num;
esum++;
}
int ans=kruskal();
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息