kruskal 算法模板

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2896

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
    int u,v,w;
}q[200001];
int bin[50001];
int n,m,ans;
int cmp(const void *a,const void *b)
{
    struct node *x;
    struct node *y;
    x = (struct node *)a;
    y = (struct node *)b;
    return x->w - y->w;
}
int find(int x)
{
    int r,k,j;
    r = x;
    while(bin[r]!=r)
    r = bin[r];
    j = x;
    while(j!=r)
    {
        k = bin[j];
        bin[j] = r;
        j = k;
    }
    return r;
}
void kruskal()
{
    int i;
    for(i = 1;i<=n;i++)
    {
        bin[i] = i;
    }
    for(i = 0;i<m;i++)
    {
        int uu = find(q[i].u);
        int vv = find(q[i].v);
        if(uu!=vv)
        {
            bin[uu] = vv;
            ans+=q[i].w;
        }
    }
    printf("%d\n",ans);
}
int main()
{
    int i,j;
    while(~scanf("%d%d",&n,&m))
    {
        ans = 0;
        for(i = 0;i<m;i++)
        {
            scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);
        }
        qsort(q,m,sizeof(q[0]),cmp);
        kruskal();
    }
    return 0;
}

对于kruskal 算法的理解 :这个算法,我一直半知半解,知道现在才能够说明白,但也还不够熟练,谈谈我对这个算法的理解。

最小生成树的算法一共学了两种,分别是prim算法和kruskal算法,prim算法是我掌握的最好的算法之一,可或许因此对于prim算法过于依赖,对kruskal算法应用不熟练,导致很多题都不能AC ,现在重新学习一下kruskal算法,kruskal算法是一种加边的算法,适合点特别多的数据,kruskal算法应用并查集的知识,判断是否会形成回路,

还有就是结构体一级排序 两个重难点,

特别写一下cmp函数

int cmp(const void *a,const void *b)

{

  struct node *x,*y;

  x = (struct node *)a;

  y = (struct node *)b; (括号不可少)

  return x.w-y.w;

}

查找函数也是关键,krusal算法比较简单,可以遍历所有的边,进行判断。

kruskal 算法模板,布布扣,bubuko.com

时间: 2024-12-11 13:48:15

kruskal 算法模板的相关文章

UVA 10369(求第K长的边,kruskal算法模板)

Arctic Networks Time Limit: 3000 MS The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication technologies are to be used in establishing the network: every outpost will ha

POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14021   Accepted: 5484   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

POJ 1797 kruskal 算法

题目链接:http://poj.org/problem?id=1797 开始题意理解错.不说题意了. 并不想做这个题,主要是想测试kruskal 模板和花式并查集的正确性. 已AC: /* 最小生成树 kruskal算法 过程:每次选取没有参与构造最小生成树并且加入之后不会构成回路的边中权值最小的一条 作为最小生成树的一条新边.直至选择了V-1条边. */ #include <stdio.h> #include <string.h> #include <iostream>

HDU 1233 prim kruskal最小生成树模板题

A - 还是畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试

HDU 1102 Constructing Roads【简单最小生成树,Prime算法+Kruskal算法】

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20765    Accepted Submission(s): 7934 Problem Description There are N villages, which are numbered from 1 to N, and you should

POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 8315 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each

HDU 1233 还是畅通工程【最小生成树入门题,Kruskal算法+Prim算法】

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 39929    Accepted Submission(s): 18144 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路

HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21871    Accepted Submission(s): 9356 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

hdu 1875 畅通工程再续(kruskal算法计算最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18411    Accepted Submission(s): 5769 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先