zoukankan      html  css  js  c++  java
  • FZU 2254 英语考试 (最小生成树)

    在过三个礼拜,YellowStar有一场专业英语考试,因此它必须着手开始复习。

    这天,YellowStar准备了n个需要背的单词,每个单词的长度均为m。

    YellowSatr准备采用联想记忆法来背诵这n个单词:

    1、如果YellowStar凭空背下一个新词T,需要消耗单词长度m的精力

    2、如果YellowSatr之前已经背诵了一些单词,它可以选择其中一个单词Si,然后通过联想记忆的方法去背诵新词T,需要消耗的精力为hamming(Si, T) * w。

    hamming(Si, T)指的是字符串Si与T的汉明距离,它表示两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

    由于YellowStar还有大量繁重的行政工作,因此它想消耗最少的精力背诵下这n个单词,请问它最少需要消耗多少精力。

    Input

    包含多组测试数据。

    第一行为n, m, w。

    接下来n个字符串,每个字符串长度为m,每个单词均为小写字母'a'-'z'组成。

    1≤n≤1000

    1≤m, w≤10

    Output

    输出一个值表示答案。

    Sample Input

    3 4 2
    abch
    abcd
    efgh

    Sample Output

    10

    Hint

    最优方案是:先凭空记下abcd和efgh消耗精力8,在通过abcd联想记忆去背诵abch,汉明距离为1,消耗为1 * w = 2,总消耗为10。

    明明昨天刚学了生成树,结果今天做就没想到建图,真的蒟蒻。

    因为要覆盖全部单词,那么可以想到生成树,那什么可以作为两个结点单词的链接呢,肯定是花费了,而且需要最小,那就是最小生成树了。

    嗯这个先遍历一遍 ,把两两单词之间的花费求出来,以此为路径长度,这样求个最小生成树,最后加上一个结点的值即m就好。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 char word[1002][11];
     7 
     8 struct Node
     9 {
    10     int x,y,w;
    11 }node[500005];
    12 int p[1002];
    13 int finds(int x)
    14 {
    15     return p[x] == x?x:p[x] = finds(p[x]);
    16 }
    17 bool cmp(Node a,Node b)
    18 {
    19         return a.w<b.w;
    20 }
    21 int main()
    22 {
    23     int n,m,w;
    24     while(~scanf("%d%d%d",&n,&m,&w))
    25     {
    26         int tot = 0;
    27         for(int i=0;i<n;i++)
    28         {
    29             scanf("%s",word[i]);
    30         }
    31 
    32         for(int i=0;i<n-1;i++)
    33         {
    34             for(int j=i+1;j<n;j++)
    35             {
    36                 int num = 0;
    37                 for(int k=0;k<m;k++)
    38                 {
    39                     if(word[i][k] != word[j][k])
    40                     {
    41                             num++;
    42                     }
    43                 }
    44                 node[tot].x = i;
    45                 node[tot].y = j;
    46                 node[tot++].w = num*w < m?num*w:m;
    47             }
    48         }
    49         sort(node,node+tot,cmp);
    50         int ans = 0;
    51         for(int i=0;i<n;i++)p[i]=i;
    52         for(int i=0;i<tot;i++)
    53         {
    54             int x = finds(node[i].x);
    55             int y = finds(node[i].y);
    56             if(x != y)
    57             {
    58                 ans += node[i].w;
    59                 p[x] = y;
    60             }
    61         }
    62         printf("%d
    ",ans+m);
    63     }
    64 }
    View Code
  • 相关阅读:
    java将pdf转成base64字符串及将base64字符串反转pdf
    input校验不能以0开头的数字
    js校验密码,不能为空的8-20位非纯数字或字母的密码
    tomcat正常关闭,端口号占用解决 StandardServer.await: create[8005]:
    Eclipse中项目报Target runtime com.genuitec.runtime.generic.jee60 is not defined异常的解决
    Access restriction: The type Base64 is not accessible due to restriction on
    [操作系统] 线程和进程的简单解释
    ssh登录一段时间后断开的解决方案
    [SAMtools] 常用指令总结
    [C] 有关内存问题
  • 原文地址:https://www.cnblogs.com/iwannabe/p/9119599.html
Copyright © 2011-2022 走看看