题目链接:http://poj.org/problem?id=1789
Description
Input
Output
Sample Input
4 aaaaaaa baaaaaa abaaaaa aabaaaa 0
Sample Output
The highest possible quality is 1/3.
Source
题意:
给出 n 种卡车,每种卡车的类型是由七个字符组成的,一种卡车可以从另一种卡车派生而来,所需要的代价是两种卡车类型不同的字符个数,求出这 n 种卡车派生的最小代价, n 种车有一 种是开始就已经有的,其余的 n-1 种是派生出来的。
思路:
最小生成树。
代码如下:
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
const int MAXN = 2000+17;
char s[MAXN][17];
int m[MAXN][MAXN];
int low[MAXN], visited[MAXN];
int n;
int Cont(int x, int y)
{
int c = 0;
for(int i = 0; i < 7; i++)
{
if(s[x][i] != s[y][i])
c++;
}
return c;
}
int prim()
{
int i, j;
int pos, minn, result = 0;
memset(visited,0,sizeof(visited));
visited[0] = 1;
pos = 0;
for(i = 0; i < n; i++)
{
low[i] = m[pos][i];
}
for(i = 0; i < n-1; i++)
{
minn = INF;
pos = -1;
for(j = 0; j < n; j++)
{
if(!visited[j] && low[j] < minn)
{
minn = low[j];
pos = j;
}
}
result += minn;
visited[pos] = 1;
for(j = 0; j < n; j++)
{
if(!visited[j] && low[j]>m[pos][j])
low[j] = m[pos][j];
}
}
return result;
}
int main()
{
while(scanf("%d",&n) && n)
{
getchar();
for(int i = 0; i < n; i++)
{
gets(s[i]);
}
memset(m,0,sizeof(m));
for(int i = 0; i < n-1; i++)
{
for(int j = i+1; j < n; j++)
{
m[i][j] = m[j][i] = Cont(i,j);
}
}
int ans = prim();
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}
poj 1789 Truck History(最小生成树),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012860063/article/details/38681633