poj1789 Truck History

每个字符串可看成一点,每两个字符串不相同的字母的数量可看成两点之间的距离。

求1/Q的最大值即相当于求最小生成树,用prim即可。

#include<iostream>
#include<stdio.h>
#include<string.h>
#define MAXD 2010
#define INF 0x3f3f3f3f
using namespace std;
int N,graph[MAXD][MAXD],res;
char data[MAXD][8];

void MST_PRIM()
{
    int key[MAXD],flag,p;
    bool vis[MAXD];
    memset(vis,0,sizeof(vis));
    memset(key,0x3f,sizeof(key));
    key[1]=0;
    int i,j;
    for(i=1;i<=N;i++)
    key[i]=graph[1][i];
    vis[1]=true;
    res=0;
    for(i=1;i<N;i++)
    {
        flag=INF,p=-1;
        for(j=1;j<=N;j++)
        {
            if(!vis[j]&&key[j]<flag)
            {
                flag=key[j];
                p=j;
            }
        }
        vis[p]=true;
        res+=flag;
        for(j=1;j<=N;j++)
        {
            if(!vis[j]&&key[j]>graph[p][j])
            key[j]=graph[p][j];
        }
    }
}
int main()
{
    //freopen("test.txt","r",stdin);
    while(scanf("%d",&N)!=EOF)
    {
        if(N==0)
        return 0;
        int i,j,k;
        for(i=1;i<=N;i++)
        {
            scanf("%s",data[i]);
        }
        memset(graph,0,sizeof(graph));
        for(i=1;i<=N;i++)
        {
            for(j=i+1;j<=N;j++)
            {
                for(k=0;k<8;k++)
                {
                    if(data[i][k]!=data[j][k])
                    graph[i][j]++;
                }
                graph[j][i]=graph[i][j];
            }
        }
        MST_PRIM();
        printf("The highest possible quality is 1/%d.\n",res);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/longlongagocsu/p/2870179.html