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

56

57

58

59

60

61

62

63

#include<iostream>

#include<cstring>

using
namespace std;

char
a[2222][10];

int dist[2222];

int s[2222];

int n;

int e(int u,int v)

{

    int
l=0;

    for(int
i=0;i<7;i++)

        if(a[u][i]!=a[v][i])

            l++;

    return
l;

}

void
Kruskal()

{

    int
sum=0;

    int
i,j;

    dist[1]=0;

    memset(s,0,sizeof(s));

    for(i=2;i<=n;i++)

    {

        int
l=0;

        for(j=0;j<7;j++)

            if(a[1][j]!=a[i][j])

                l++;

        dist[i]=l;

    }

    s[1]=1;

    for(i=1;i<=n;i++)

    {

        int
v=-1;

        int
min=999999999;

        for(j=2;j<=n;j++)

        {

            if(dist[j]<min&&!s[j])

                min=dist[j],v=j;

        }

        if(v==-1) break;

        sum+=dist[v];

        s[v]=1;dist[v]=0;

        for(j=2;j<=n;j++)

        {

            if(dist[j]>e(v,j))

                dist[j]=e(v,j);

        }

    }

    printf("The highest possible quality is 1/%d.\n",sum);

}

int
main()

{

    int
i;

    while(scanf("%d",&n)!=EOF)

    {

        if(n==0) break;

        for(i=1;i<=n;i++)

            scanf("%s",a[i]);

        Kruskal();

    }

    return
0;

}

   

poj 1789,布布扣,bubuko.com

时间: 2024-10-13 07:25:09

poj 1789的相关文章

poj 1789 Truck History 解题报告

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

ZOJ 2158 &amp;&amp; POJ 1789 Truck History (经典MST)

链接:http://poj.org/problem?id=1789 或  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1158 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for vegetable delivery, other for furniture, or for br

【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(kruskal算法)

题目链接:http://poj.org/problem?id=1789 思路:把每一行看成一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列写的,但是超时啦,不知道为什么,希望有人可以解答.后面用的数组sort排序然后才AC. code: 数组sort排序AC代码: #include<cstdio> #include<queue> #include<algorithm> #include<io

POJ 1789 -- Truck History(Prim)

 POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 2000 + 10; 6 const int INF = 1000000; 7 int n;//有几个卡车 8 char str[maxn][10]; 9 int d[ma

POJ 1789 Truck History (Kruskal 最小生成树)

Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19860   Accepted: 7673 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for vegetable delivery, other for furniture, or for brick

(最小生成树)Truck History --POJ -- 1789

链接: http://poj.org/problem?id=1789 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <algorithm> using namespace std; const int N = 2005; const int INF = 0xfffffff

Truck History POJ 1789

http://poj.org/problem?id=1789 题意:简单来说,就是给出一个 n 行的字符串, 字符串与字符串间的距离为它们相照应的比较有几个不同的字母, 然后求出 n 行字符串直接或间接相连中最短的距离为多少.(生成树模板) 写最小生成树的专题真的比之前其他专题感觉好多了.(%>_<%)   #include<stdio.h> #include<string.h> #include<math.h> #include<queue>