天天看點

hdoj 1233 還是暢通工程---最小生成樹---Kruskal算法

#include <iostream>                                                   
#include <cstring>                                                    
#include <cstdio>                                                     
#include <algorithm>                                                  
using namespace std;                                                  
const int maxn=5005;                                                  
struct node{                                                          
	int u,v,weight;                                                      
}edge[maxn];                                                          
int set[105];                                                         
bool cmp(node a,node b){                                            
	return a.weight<b.weight;                                            
}                                                                     
int f_set(int u){
	if(set[u]==-1)return u;
	else return set[u]=f_set(set[u]);
}                                                                      
int u_s_set(int u,int v){                                             
	   int u1=f_set(u);
	   int v1=f_set(v);
	   if(u1==v1)return 0;
	   if(u1<v1)set[v1]=u1;
	   else set[u1]=v1;
	   return 1;                                                                  
}                                                                     
int main()                                                            
{                                                                     
	int n;                                                               
	while(cin>>n)                                                        
	{                                                                    
		if(n==0)break;                                                      
		int m=n*(n-1)/2;                                                    
		memset(set,-1,sizeof(set));                                         
		for(int i=0;i<m;i++)                                                
			scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].weight);             
		sort(edge,edge+m,cmp);                                              
		int minsum=0,cnt=0;                                                 
		for(int i=0;i<m;i++)                                                
		{                                                                   
			if(u_s_set(edge[i].u,edge[i].v)){                                  
				   cnt++;
				   minsum+=edge[i].weight;                                                               
			}                             
			if(cnt==n-1)break;                                     
			                                                                   
		}        
		cout<<minsum<<endl;                                                           
		                                                                    
	}  
	return 0;                                                                  
}