标签:
Input
Output
Sample Input
4
Sample Output
The highest possible quality is 1/3.
Source
CTU Open 2003
题目大意:给你N个字符串,每个字符串代表一个结点,每个结点之间的距离为字符串中
不同字符的个数。比如:"abaaaaa"和"aabaaaa",第二个和第三个字符不同,两个结点
之间的距离就是2。以此类推,得到所有的结点。求所有结点构成图的最小生成树。
思路:按题意算出各结点之间的距离,存入图中,用Prim算法求解,注意输出格式。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int Map[2010][2010];
char MAP[2010][8];
int low[2010],vis[2010];
int Prim(int N)
{
memset(vis,0,sizeof(vis));
int ans = 0;
vis[1] = 1;
int pos = 1;
for(int i = 1; i <= N; ++i)
if(i != pos)
low[i] = Map[pos][i];
for(int i = 1; i < N; ++i)
{
int Min = 0xffffff0;
for(int j = 1; j <= N; ++j)
{
if(Min > low[j] && !vis[j])
{
Min = low[j];
pos = j;
}
}
ans += Min;
vis[pos] = 1;
for(int j = 1; j <= N; ++j)
{
if(!vis[j] && Map[pos][j] < low[j])
{
low[j] = Map[pos][j];
}
}
}
return ans;
}
void GetMap(int N)
{
memset(Map,0xffffff0,sizeof(Map));
for(int i = 1; i <= N; ++i)
{
for(int j = i; j <= N; ++j)
{
int sum = 0;
for(int k = 0; k < 7; ++k)
{
if(MAP[i][k] != MAP[j][k])
sum++;
}
Map[i][j] = Map[j][i] = sum;
if(i == j)
Map[i][j] = 0;
}
}
}
int main()
{
int N;
while(~scanf("%d",&N) && N)
{
memset(MAP,0,sizeof(MAP));
for(int i = 1; i <= N; ++i)
scanf("%s",MAP[i]);
GetMap(N);
int ans = Prim(N);
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/43086859