| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 20140 | Accepted: 7791 |
Description
Input
Output
Sample Input
4 aaaaaaa baaaaaa abaaaaa aabaaaa 0
Sample Output
The highest possible quality is 1/3.
题目链接:http://poj.org/problem?id=1789
题目大意:长度相同的n个字符数组代表n个点,两个字符数组之间不同字符个数即为这两点之间的距离大小。克鲁斯卡尔算法实现即可。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[2002][10];
int fa[2002];
struct A
{
int x,y;
int len;
}a[2000002];
int cmp(A a,A b)
{
return a.len<b.len;
}
void get_fa()
{
for(int i=0;i<2002;i++)
fa[i]=i;
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void Union(int a,int b)
{
int a1=find(a);
int b1=find(b);
if(a1!=b1)
fa[a1]=b1;
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF&&n)
{
getchar();
int t=0,ans=0,m=0;
get_fa();
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
scanf("%s",s[i]);
int l=strlen(s[0]);
for(i=0;i<n;i++) //建图过程
{
for(j=i+1;j<n;j++)
{
int cnt=0;
for(k=0;k<l;k++)
{
if(s[i][k]!=s[j][k])
cnt++;
}
a[m].x=i;
a[m].y=j;
a[m++].len=cnt;
}
}
sort(a,a+m,cmp);
for(i=0;i<m;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
Union(a[i].x,a[i].y);
ans+=a[i].len;
t++;
}
if(t>n)
break;
}
printf("The highest possible quality is 1/%d.\n", ans);
}
return 0;
}poj 1789 Truck History (克鲁斯卡尔)
原文地址:http://blog.csdn.net/criminalcode/article/details/45082693