poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)

题目大意是就是给出n个长度为7的字符串,每个字符串代表一个车,定义车的距离是两个字符串间不同字母的个数,题目要求的数不同的车的距离的最小值,即所求的就是最小生成树

Sample Input

4
aaaaaaa
baaaaaa
abaaaaa
aabaaaa
0
Sample Output

The highest possible quality is 1/3. //输出 1/权值之和

prim

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # define LL long long
 7 using namespace std ;
 8
 9 const int INF=0x3f3f3f3f;
10 const int MAXN=2010;
11 bool vis[MAXN];
12 int lowc[MAXN];
13 int n ;
14 int cost[MAXN][MAXN] ;
15 char s[2010][10] ;
16
17 int Prim()//点是0~n-1
18 {
19     int ans=0;
20     memset(vis,false,sizeof(vis));
21     vis[0]=true;
22     for(int i=1;i<n;i++)lowc[i]=cost[0][i];
23     for(int i=1;i<n;i++)
24     {
25         int minc=INF;
26         int p=-1;
27         for(int j=0;j<n;j++)
28             if(!vis[j]&&minc>lowc[j])
29             {
30                 minc=lowc[j];
31                 p=j;
32             }
33             if(minc==INF)return -1;//原图不连通
34             ans+=minc;
35             vis[p]=true;
36             for(int j=0;j<n;j++)
37                 if(!vis[j]&&lowc[j]>cost[p][j])
38                     lowc[j]=cost[p][j];
39     }
40     return ans;
41 }
42
43 int main()
44 {
45
46    // freopen("in.txt","r",stdin) ;
47     while(scanf("%d" , &n) !=EOF)
48     {
49         if (n == 0)
50             break ;
51         int w ;
52         int i , j ,k ;
53         for (i = 0 ; i < n ; i++)
54             for (j = 0 ; j < n ; j++)
55                cost[i][j] = INF ;
56         for (i = 0 ; i < n ; i++)
57             scanf("%s" , s[i]);
58         for (i = 0 ; i < n ; i++)
59             for (j = i+1 ; j < n ; j++)
60         {
61             w = 0 ;
62             for (k = 0 ; k < 7 ; k++)
63             {
64                 if (s[i][k] != s[j][k])
65                     w++ ;
66             }
67             cost[i][j] = w ;
68             cost[j][i] = w ;
69         }
70         printf("The highest possible quality is 1/%d.\n",Prim());
71
72
73     }
74     return 0 ;
75 }

时间: 2024-10-15 15:17:38

poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)的相关文章

给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 0101 故它的二进制权值为7(二进制表示中有7个1) 现在要求一个比N大,且最靠近N的数,且这个数的二进制权值与N相同.(这里不考虑Integer.MAX_VALUE 和负数情形.) 对于有符号的32位整数而言:它们的补码如下: Integer.MAX_VALUE= 0111 1111 1111 11

【POJ 1789】Truck History

[POJ 1789]Truck History 对于弱这种英语渣来说 这明明就是个英语阅读题啊!!--虽然已经习惯了..不过这题寒假集训刚做过 在哪来一看还是没读懂--千刀万剐煮了我吧 一个字符串由7个小写字母组成 每个字符串表示一种状态 每个状态只能由另一种状态转换 转换耗时为两个字符串中不同字母的数量(即distance -> [0,7]) 读出来这些就好办了 赤果果的最小生成树,Prim Kruskal都可以 测了测这题Kruskal耗时少--但2000个点的话1999000条边(无向)

Kuskal/Prim POJ 1789 Truck History

题目传送门 1 /* 2 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 3 Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Prim.这是最小生成数的裸题,然而题目有点坑爹:( 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 #include

poj 1789 Truck History 解题报告

题目链接:http://poj.org/problem?id=1789 题目意思:给出 N 行,每行7个字符你,统计所有的 行 与 行 之间的差值(就是相同位置下字母不相同),一个位置不相同就为1,依次累加.问最终的差值最少是多少. 额.....题意我是没看懂啦= =......看懂之后,就转化为最小生成树来做了.这是一个完全图,即每条边与除它之外的所有边都连通.边与边的权值是通过这个差值来算出来的. 1 #include <iostream> 2 #include <cstdio>

poj 1789

题意:给定N个字符串  每个字符串可以看为一个点  每个点之间都有边   长度为对应两点之间字符不同的个数  把这些点连接起来  求最小的边长 思路:Kruskal  算法的简单应用 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

获取某个字符串的所有字节数

<script type="text/javascript">        function getBytes(str){            if(!arguments.length || !str)                return null;            if(str.length == '')                return 0;            var len = str.length;            var by

C#判断字符串是否存在字母及字符串中字符的替换实例

本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法.分享给大家供大家参考.具体实现方法如下: 首先要添加对命名空间"using System.Text.RegularExpressions;"的引用 下面以一个字符串为例: 代码如下: string ss = "aaZ31 dd2f3"; string sss = ss.Replace(" ", "");//将字符串ss中的空格去掉 string sss2 =

POJ #1789 Truck History 最小生成树(MST) prim 稠密图 链式向前星

Description 题目:链接 这道题的数据集网上比较少,提供一组自己手写的数据: INPUT: 3 aaaaaaa baaaaaa abaaaaa OUTPUT: The highest possible quality is 1/2. 思路 题意比较不好理解,简而言之就是有 n 个字符串,设两个字符串之间的差异为 dis,dis 由两个字符串对应位置上不同字母的数量决定.比如串A"aaaaaaa" .串B"baaaaaa" 和串C"abaaaaa&

算法积累(字符串转换驼峰,判断一个字符串中那个字母出现次数最多,并且出现了几次)

因为算法比较烂,所以想做一下这方面的积累. 尽量能够每天学习一个新算法吧.(不过估计很悬) 好吧,今天第一个是字符串转换驼峰 直接上代码 var str = 'toupper-case'; var arr = str.split('-'); //toupper,case for (var i = 1; i < arr.length; i++) { //把除了第一个数组后面的数组的第一个值设置为大写然后大写字母和去掉第一个字符的剩下的字符进行拼合 arr[i] = arr[i].charAt(0)