最小生成树

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


posted @ 2016-08-27 19:36  Drinkwater_cnyali  阅读(88)  评论(0编辑  收藏  举报