最小生成树,kruskal

最小生成树,

利用全部n个点,n-1条边建成权值最小是的树,

在无向图中选点选边,

利用并查集思想,贪心,

附上并查集思想:

如果你是你爸爸,返回你,否则返回寻找你爸的结果

kruskal

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <bits/stdc++.h>
 5 
 6 using namespace std;
 7 
 8 #define MAXN 500010
 9 struct edge{
10     int x,y,z;
11     //x和y之间有一条权值为z的边 
12 }e[MAXN];
13 int fa[MAXN],n,m,ans;
14 bool cmp(edge a,edge b) {
15     return a.z<b.z;
16 }
17 int get_fa(int x) {
18     if (x==fa[x]) return x;
19     return fa[x]=get_fa(fa[x]);
20     //如果你是你爸爸,返回你
21     //否则返回寻找你爸的结果 
22 }
23 int main () { 
24     cin>>n>>m;
25     for (int i=1;i<=m;i++) {
26         cin>>e[i].x>>e[i].y>>e[i].z;
27     }
28     sort(e+1,e+m+1,cmp);
29     for (int i=1;i<=n;i++) {
30         fa[i]=i;
31     }
32     for (int i=1;i<=m;i++) {
33         int x=get_fa(e[i].x);
34         int y=get_fa(e[i].y);
35         if (x==y) continue;
36         fa[x]=y;
37         ans+=e[i].z;
38         cout<<e[i].x<<" "<<e[i].y;
39         cout<<endl;
40     }
41     cout<<ans<<endl;
42     return 0;
43 }
44 
45 /*
46 5 6
47 1 2 3
48 1 4 5
49 1 3 6
50 2 5 2
51 2 3 4
52 4 5 9
53 */

猜你喜欢

转载自www.cnblogs.com/codemaker-li/p/9779978.html