poj 1789 最小生成树 kruskal实现

题目链接:http://poj.org/problem?id=1789

1Y

题目大意:对于每一个点给你一个字符串,两个点之间的距离就是两个点所对应的字符串对应位置有几个不同的字符。。找出最小生成树。

把Kruskal换成了用一个struct来记录边的两个点,以及这条边的距离。这样就不需要多开一个数组。。。

之后用一个结构体排序,让长度最小的边排到最前面。。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 2009
struct node  //用一个struct来记录每条边的信息
{
    int u,v,w;
}line[M*M/2];
char s[M][10];
int p[M]; //记录每个点的父节点
int n;
int ans;
int num;
int cmp(node a,node b)
{
    return a.w < b.w;//按边进行升序排列
}
int find(int x)
{
    return x==p[x]?x:p[x]=find(p[x]);
}
void kruskal()
{
    for(int i = 0;i < num;i++)
    {
        int x = find(line[i].u);
        int y = find(line[i].v);
        if(x!=y) //不在一个集合
        {
            p[x] = y; //合并集合
            ans += line[i].w;
        }
    }
}
int main()
{
    while(scanf("%d",&n)==1 && n)
    {
        ans = 0;
        for(int i = 1;i <= n;i++)
        {
            p[i] = i;
            scanf("%s",s[i]);
        }
        num = 0;
        for(int i = 1;i <= n;i++)
        for(int j = i+1;j <= n;j++)
        {
            int temp = 0;
            for(int k = 0;k < 8;k++)
            {
                if(s[i][k]!=s[j][k])
                    temp++;
            }
            line[num].u = i;
            line[num].v = j;
            line[num++].w = temp;
        }
        sort(line,line+num,cmp);
        kruskal();
        printf("The highest possible quality is 1/%d.\n",ans);
    }
    return 0;
}
时间: 2024-10-05 04:59:31

poj 1789 最小生成树 kruskal实现的相关文章

POJ 1789 (最小生成树 Prim)

题目描述:给予n个长度为7的字符串,定义两字符串间的代价为同一位置不同的字符的个数,现在要联通所有的字符串求最小代价.    思路:一开始使用Krustal算法,然而因为是稠密图导致TLE,换用Prim. Krustal:(TLE) #include <cstdio> #include <algorithm> #include <iostream> #include <queue> #define N 2005 using namespace std; st

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——2031 最小生成树(MST) Kruskal算法

poj——2031 最小生成树(MST)  Kruskal算法 Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4985   Accepted: 2503 Description You are a member of the space station engineering team, and are assigned a task in the constructio

【POJ 1789】Truck History

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

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

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(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

SOJ4339 Driving Range 最小生成树 kruskal算法

典型的最小生成树 然后求最大的一条边 附上链接 http://cstest.scu.edu.cn/soj/problem.action?id=4339 需要注意的是有可能有 "IMPOSSIBLE" 的情况 这里用一个flag标记 记录所并的节点 只有flag = n时才能成功 负责就 "IMPOSSIBLE" 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g