kruskal(最小生成樹)
阿新 • • 發佈:2018-11-12
思想:
將圖中的邊按照權值的大小排序,存在數組裡。依次取出後,用並查集將邊的另一個點打上標記。到所有點都打上標記後,結束。
#include<bits/stdc++.h> #define maxn 100010 using namespace std; int tot=0; int vis[maxn],fa[maxn]; struct node{ int u,v,w; }; node edge[maxn]; bool cmp(node x,node y){ return x.w<y.w; } int find(int x){ if(fa[x]==x) return x; fa[x]=find(fa[x]); return fa[x]; } void merge(int x,int y){ int a=find(x),b=find(y); fa[b]=a; } int main(){ freopen("temp.in","r",stdin); int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d %d %d",&x,&y,&z); edge[++tot].u=x;edge[tot].v=y;edge[tot].w=z; edge[++tot].u=y;edge[tot].v=x;edge[tot].w=z; } for(int i=1;i<=n;i++)fa[i]=i; sort(edge,edge+tot+1,cmp); int k=1,ans=0; for(int i=1;i<n;i++){ while(find(edge[k].u)==find(edge[k].v))k++; ans+=edge[k].w; merge(edge[k].u,edge[k].v); } printf("%d\n",&ans); return 0; }