• poj1789--最小生成树(prim)


    水题。。。

    题目大意:

          用一个7位的字符串代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数。一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance,现在要找出一个“衍生”方案,使得总代价最小,也就是distance之和最小。

          很容易想到,将每两个顶点间的distance求出作为边权,将题目转化为最小生成树问题。由于是稠密图,所以用prim算法。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int i,j,k,n,m,x,a[2001][2001],ans,minn,d[2001],tot,c[2001];
    bool b[2001];
    char s[2001][7];
    int main()
    {
        scanf("%d",&n);
        while(n){
            memset(d,127,sizeof(d));
            memset(b,0,sizeof(b));
            memset(a,0,sizeof(a));
            ans=0;tot=1;
            for(i=1;i<=n;i++)scanf("%s",s[i]);
            for(i=1;i<n;i++)
            for(j=i+1;j<=n;j++){
                for(k=0;k<7;k++)if(s[i][k]!=s[j][k])a[i][j]++;
                a[j][i]=a[i][j];
            }
            c[1]=1;d[1]=0;k=1;b[1]=1;
            while(tot<n){
                minn=2147483647;
                for(i=1;i<=n;i++)
                if(!b[i]){
                    if(d[c[k]]+a[c[k]][i]<d[i])d[i]=d[c[k]]+a[c[k]][i];
                    if(d[i]<minn){
                        minn=d[i];
                        x=i;
                    }
                }
                b[x]=1;
                c[++tot]=x;
                ans+=d[x];
                d[x]=0;
                k++;
            }
            printf("The highest possible quality is 1/%d.
    ",ans);
            scanf("%d",&n);
        }
        return 0;
    }
  • 相关阅读:
    提示“此Flash Player与您的地区不相容,请重新安装Flash”的解决办法
    python中安装并使用redis
    linux安装flash player来播放视频
    安装redis
    centos6.5安装无线网卡驱动并配置wifi
    centos安装java的jdk
    001-python简介
    源码
    进程间通信之综述
    图的概念
  • 原文地址:https://www.cnblogs.com/gjghfd/p/5714201.html
Copyright © 2020-2023  润新知