kruskal模板

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX (int)1e5
using namespace std;
struct line
{
    int u;
    int v;
    int w;
};
int n,m;
int pre[MAX+7];
struct line l[MAX+7];
void init()
{
    for(int i=1;i<=n;i++)
        pre[i]=i;
}
int find(int x)
{
    int r=x;
    while(r!=pre[r])
        r=pre[r];
    return r;
}
int cmp(line a,line b)
{
    return a.w<b.w;
}
int kruskal()
{
    int ans=0;
    init();
    sort(l+1,l+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int fx=find(l[i].u);
        int fy=find(l[i].v);
        if(fx!=fy)
        {
            pre[fx]=fy;
            ans+=l[i].w;
        }
    }
    return ans;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&l[i].u,&l[i].v,&l[i].w);
        printf("%d\n",kruskal());
    }
    return 0;
}

时间: 2024-12-10 06:54:30

kruskal模板的相关文章

poj3723Conscription kruskal模板水题

//N个女孩,M个男孩,雇佣一个人的费用为10000 //男孩与女孩之间的关系为d,那么如果雇佣了一个,雇佣另一个的费用为10000-d //每个人只能通过一种关系优惠 //问最少需要花费多少雇佣这些人 //很明显的最大生成树 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std ; const int maxn = 5001

Kruskal 模板(Hdu - 1162)

最小生成树指的是在图上面找到权值最小的一棵树,并且保证图上所有的点都在这棵树上. 解决办法:Kruskal 算法(贪心思想) /** * Fuck you. * I love you too. */ #include<bits/stdc++.h> #define lson i<<2 #define rson i<<2|1 #define LS l,mid,lson #define RS mid+1,r,rson #define mem(a,x) memset(a,x,s

【还是畅通工程 HDU - 1233】【Kruskal模板题】

Kruskal算法讲解 该部分内容全部摘录自刘汝佳的<算法竞赛入门经典> Kruskal算法的第一步是给所有边按照从小到大的顺序排列. 这一步可以直接使用库函数 qsort或者sort. 接下来从小到大依次考查每条边(u,v). 情况1: u和v在同一个连通分量中, 那么加入(u, v)后会形成环, 因此不能选择. 情况2: 如果u和v在不同的连通分量, 那么加入(u, v)一定是最优的. 为什么呢? 下面用 反证法--如果不加这条边能得到一个最优解T, 则T+(u, v)一定有且只有一个环,

POJ 1797 kruskal 算法

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

POJ 2485 Highways 最小生成树 (Kruskal)

Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Flatopian government is aware of this problem. They're planning to build some highways so that i

UVA 10462 Is There A Second Way Left? (次小生成树+kruskal)

题目大意: Nasa应邻居们的要求,决定用一个网络把大家链接在一起.给出v个点,e条可行路线,每条路线分别是x连接到y需要花费w. 1:如果不存在最小生成树,输出“No way”. 2:如果不存在次小生成树,输出“No second way”. 3:如果两者都存在,输出次小生成树的长度. 解题思路: 次小生成数+kruskal模板 1 #include <cmath> 2 #include <queue> 3 #include <string> 4 #include &

USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法

PROBLEM: (ENGLISH VERSION) Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms. Each of the N

【次小生成树】【Kruskal】【prim】【转】

原博客出处:https://blog.csdn.net/yasola/article/details/74276255 通常次小生成树是使用Prim算法进行实现的,因为可以在Prim算法松弛的同时求得最小生成树上任意两点之间的最长边.但是利用Kruskal算法却没办法在松弛的同时求得. 所以我们就要在Kruskal求完最短路后,对于每个顶点bfs一次,得到树上任意两点的最长边.之后求可以像之前一样枚举不在树上的边,代替找最小值了. 两种方法的时间杂度是一样的,但Kruskal的实现代码回长非常多

kruscal 模板

/* Kruskal模板 */ struct edge{ int from; int to; int next; int value; bool operator<(const edge a) const{ return value<a.value ; } }; const int inf=0x3f3f3f3f; inline int find(int k){ if(k==f[k]) return k; else return f[k]=find(f[k]); } inline int mer