hihoCoder#1098 最小生成树二·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
15 int mycmp(const void *a, const void *b) {
16   Edge *pa = (Edge *) a;
17   Edge *pb = (Edge *) b;
18   return pa->len - pb->len;
19 }
20
21 int N, M;
22 Edge e[MAX_EDGE];
23 int p[MAX_POINT];
24
25 int find(int i) {
26   if (p[i] == i)
27     return i;
28   return p[i] = find(p[i]);
29 }
30
31 void merge(int i, int j) {
32   int pi = find(i);
33   int pj = find(j);
34   p[pi] = pj;
35 }
36
37 int kruscal() {
38   int res = 0;
39
40   qsort(e, M, sizeof(Edge), mycmp);
41   for (int i = 0; i < M; i++) {
42     if (find(e[i].a) == find(e[i].b))
43       continue;
44     res += e[i].len;
45     merge(e[i].a, e[i].b);
46   }
47
48   return res;
49 }
50
51 int main() {
52   scanf("%d%d", &N, &M);
53   for (int i = 1; i <= N; i++)
54     p[i] = i;
55   for (int i = 0; i < M; i++)
56     scanf("%d%d%d", &(e[i].a), &(e[i].b), &(e[i].len));
57
58   printf("%d\n", kruscal());
59   return 0;
60 }
时间: 2024-10-12 12:52:16

hihoCoder#1098 最小生成树二·Kruscal算法的相关文章

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

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

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()就行了) (