最近学了一下最小生成树。。。发发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
测试数据*/