zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java中文api 安装和引入eclipse
    【JAVA学习笔记】Java中的static关键字解析
    终于做好了JDBC在java和sql 2005之间的连接了 ,快哭了
    CF 5 A. Chat Server's Outgoing Traffic
    NYOJ 16 矩形嵌套
    poj 1061 青蛙的约会
    nefu 2 猜想
    nefu 120 梅森素数
    nefu 118 n!后面有多少个0
    nefu 117 素数个数的位数
  • 原文地址:https://www.cnblogs.com/gjghfd/p/5714201.html
Copyright © 2011-2022 走看看