卡鲁斯卡尔
(图片资料摘自dzj_ppt)
最小生成树
克鲁斯卡尔
代码
#include<iostream> #include<cstdio> #include<algorithm> #define maxn 5000 #define maxm 200000 using namespace std; int fa[maxn]; struct edge{ int u,v,w; }e[maxm]; int n,m; int u,v; int ans=0; void init(){//初始化 for(int i=1;i<=n;i++){ fa[i]=i; } } int getFa(int x){ if(x==fa[x]) return x; else return fa[x]=getFa(fa[x]); } void merge(int x,int y){ fa[x]=y; } bool cmp(edge a,edge b){//结构体比较 return a.w<b.w; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; e[i].u=u; e[i].v=v; e[i].w=w; } sort(e+1,e+m+1,cmp);//按照权值排序,贪心思想 init(); for(int i=1;i<=m;i++){ int t1=getFa(e[i].u); int t2=getFa(e[i].v); if(t2!=t1){ merge(t1,t2); ans+=e[i].w;v } } cout<<ans; return 0; }
待到oi十一月,我花开后百花杀。