poj 1789 prime

链接:Truck History - POJ 1789 - Virtual Judge  https://vjudge.net/problem/POJ-1789

题意:先给出一个n,代表接下来字符串的个数,接下来n个字符串,每个字符串长度为7,没有完全相同的字符串,字符串之间的距离是两个字符串里不同字符的个数(相同位置两两对比),然后求出从某个点到其他点距离和的最小值(分子一直是1,Q越小,1/Q越大),其实就是叫我们求出最小生成树,先字符串两两相比建图,然后求最小生成树。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define MAXN 2005
#define INF 0x3f3f3f
char str[MAXN][8];
int edge[MAXN][MAXN];
int vis[MAXN],dis[MAXN];
int n,m,k,t,ans;
int dist(int a,int b)
{
    int ans=0;
    for(int i=0;i<7;i++)
    {
        if(str[a][i]!=str[b][i])
        ans++; 
    } 
    return ans;
}
void build()  //建图
{
    memset(edge,0x3f,sizeof(edge));
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            edge[i][j]=edge[j][i]=dist(i,j);
        }
    }
}
void prime()    //套模板的 
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    dis[i]=edge[i][0];
    vis[0]=1;
    for(int i=0;i<n-1;i++)
    {
        int min1=INF,u=-1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[j]<min1)
            {
                min1=dis[j];
                u=j;
            }
        }
        if(u==-1)
        return;
        vis[u]=1;
        ans+=min1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[j]>edge[u][j])
            dis[j]=edge[u][j];
        }
    }
}
int main()
{
    while((cin>>n)&&n)
    {
        for(int i=0;i<n;i++)
         cin>>str[i];
        build();    //建图 
        ans=0;        
        prime();
        cout<<"The highest possible quality is 1/"<<ans<<'.'<<endl;
     } 
     return 0;
}
原文地址:https://www.cnblogs.com/6262369sss/p/9394732.html