最小生成树,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 */