最小生成树
最近学了一下最小生成树。。。发发code
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; const int maxn=1000; struct edge{//定一个结构体来存起点,终点和边权,便于后面的将边权排序; int u,v,w; }a[maxn]; int f[maxn];//并查集使用; int n,m; int count=0,sum=0; void qsort(int b,int e){ //快排很显然,可用sort 但是要重载<号,只排序边权; struct edge t; int u=b,v=e; if(u>v)return; while(u!=v){ while(u<v&&a[v].w>=a[b].w)v--; while(u<v&&a[u].w<=a[b].w)u++; if(u<v){ t=a[u]; a[u]=a[v]; a[v]=t; } } t=a[b]; a[b]=a[u]; a[u]=t; qsort(b,u-1); qsort(u+1,e); return; } int getf(int x){//并查集,找到祖先 if(f[x]==x)return x; else{ f[x]=getf(f[x]); //很显然的路径压缩; return f[x]; } } int zxscs(int v,int u){ int t1,t2; t1=getf(f[v]); t2=getf(f[u]); if(t1!=t2){//判断是否在一个集合内 f[t2]=t1; return 1; } return 0; } int main(){ int i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); } qsort(1,m); for(i=1;i<=n;i++)f[i]=i; for(i=1;i<=m;i++){ if(zxscs(a[i].u,a[i].v)){ count++; sum+=a[i].w; } if(count==n-1)break; } printf("%d\n",sum); /*for(i=1;i<=m;i++){ printf("%d %d %d",a[i].u,a[i].v,a[i].w); printf("\n"); }*/ return 0; } /*6 9 2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2 19 测试数据*/