Hihocoder #1098 : 最小生成树二·Kruscal算法 ( *【模板】 )

#1098 : 最小生成树二·Kruscal算法

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大。

所以问题变成了——小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以 通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的)。

提示:积累的好处在于可以可以随时从自己的知识库中提取想要的!

输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为2个整数N、M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数。

接下来的M行,每行描述一条路线,其中第i行为3个整数N1_i, N2_i, V_i,分别表示这条路线的两个端点和在这条路线上建造道路的费用。

对于100%的数据,满足N<=10^5, M<=10^6,于任意i满足1<=N1_i, N2_i<=N, N1_i≠N2_i, 1<=V_i<=10^3.

对于100%的数据,满足一定存在一种方案,使得任意两座城市都可以互相到达。

输出

对于每组测试数据,输出1个整数Ans,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。

样例输入
5 29
1 2 674
2 3 249
3 4 672
4 5 933
1 2 788
3 4 147
2 4 504
3 4 38
1 3 65
3 5 6
1 5 865
1 3 590
1 4 682
2 4 227
2 4 636
1 4 312
1 3 143
2 5 158
2 3 516
3 5 102
1 5 605
1 4 99
4 5 224
2 4 198
3 5 894
1 5 845
3 4 7
2 4 14
1 4 185
样例输出
92

题目分析:最多有10万个点,最多有100万条边计算生成的最小生成树的权值和。代码如下:
#include <stdio.h>
#include <string>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
struct node
{
    int u;
    int v;
    int w;
    bool operator <(const node &x)const
    {
        return w<x.w;
    }
}q[1000002];
int e=0;

int fa[100002];
int findset(int x)
{
    return fa[x]!=x?fa[x]=findset(fa[x]):x;
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int i, j;
    for(i=0; i<m; i++ )
    {
        scanf("%d %d %d", &q[i].u, &q[i].v, &q[i].w );
    }
    sort(q, q+m);
    for(i=0; i<=n; i++ )
    {
        fa[i]=i; //
    }
    int ans=0;
    int cnt=0;
    for(int k=0; k<m; k++)
    {
        if( findset(q[k].u)!=findset(q[k].v) )
        {
            fa[fa[q[k].u]] = fa[ q[k].v];
            ans+=q[k].w;
            cnt++;
            if(cnt==n-1)
            {
                break;
            }
        }
    }
    printf("%d\n", ans );

    return 0;
}

时间: 2024-10-11 02:26:20

Hihocoder #1098 : 最小生成树二·Kruscal算法 ( *【模板】 )的相关文章

hihoCoder#1098 最小生成树二&#183;Kruscal算法

原题地址 以前没写过Kruscal算法,写了才知道原来比Prime算法简单多了... 并查集的应用太经典了! 代码: 1 #include <iostream> 2 #include <cstdlib> 3 4 using namespace std; 5 6 #define MAX_EDGE 1000008 7 #define MAX_POINT 100008 8 9 struct Edge { 10 int a; 11 int b; 12 int len; 13 }; 14 1

hiho 1098 最小生成树二&#183;Kruscal算法 (最小生成树)

题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成了——小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么A

hihoCoder - hiho一下 第二十七周 - A - 最小生成树二&#183;Kruscal算法

题目1 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成了--小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需

最小生成树二&#183;Kruscal算法

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成了——小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也

hihocoder1098最小生成树(kruscal算法)

kruscal算法描述: kruscal算法的思路是:最初,把所有节点都看成孤立的集合,将图中所有的边按权重从小到大排序,然后依次遍历这些边,若边的两个端点在两个不同的集合中,则合并这条边的端点所属的两个集合,直到选出n-1条边将图中的所有n个节点都合并到了同一个集合,n-1次合并就选出了n-1条边,由这n-1条边和图上的n哥节点所构成的就是我们需要的该图的最小生成树. kruscal算法的性能依赖于边的数目,故对于稀疏图的最小生成树问题,采用kruscal算法比较优越. 我的代码: 1 #in

hihoCoder #1097 最小生成树之Prim算法

原题网址,http://hihocoder.com/problemset/problem/1097 #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但 是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就 可以使得任意两座城市都可以通过所建

ZOJ 3204 Connect them(最小生成树:kruscal算法)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3204 Connect them Time Limit: 1 Second     Memory Limit:32768 KB You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN).All connecti

hihoCoder#1097 最小生成树一&#183;Prim算法

原题地址 Prime算法,每次挑选一个距离原点最近的节点,然后收缩(visited为true) 跟Dijkstra真的很像 代码: 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 #define MAX_POINT 1024 7 8 int N; 9 int g[MAX_POINT][MAX_POINT]; 10 bool visited[MAX_POINT]; 11 12 int pr

hihocoder(1098) 最小生成树Kruskal

Kruskal比Prim简单的多,对已知边排序,然后从排序的边中跳出N-1条最短的来就可以了,当然,如果在挑的过程中出现环,就丢掉继续找,就只这么直接. 如何判定有没有环?很简单,用并查集就可以. 比如a-b,b-c,c-a构成了环,那么a-b合并,b-c合并后,如果紧接着最小边是c-a,那么并查集的find(c,a)操作就会告诉你,c,a是同一个环内,跳过,继续. 总结一下: (1)对已知边排序(如果用数组存顶点,那么直接用qsort()就行了,如果用vector,那么sort()就行了) (