zoukankan      html  css  js  c++  java
  • (step6.1.5)hdu 1233(还是畅通工程——最小生成树)

    题目大意:输入一个整数n,表示有n个村庄,在接下来的n*(n-1)/2中,每行有3个整数beigin、end、weight,分别表示路的起始村庄,结束村庄和村庄之间的距离。

    求索要修的路的最短距离


    解题思路:最小生成树(克鲁斯卡尔算法实现)。。。

    PS:更详细的说明在上一篇博客中有


    代码如下:

    /*
     * 1233_1.cpp
     *
     *  Created on: 2013年8月26日
     *      Author: Administrator
     */
    
    #include <iostream>
    
    using namespace std;
    
    struct edge{
    	int begin;
    	int end;
    	int weight;
    };
    
    const int maxn = 6000;
    int father[maxn];
    edge e[maxn*maxn];
    
    int find(int x){
    	if( x == father[x]){
    		return x;
    	}
    
    	father[x] = find(father[x]);
    	return father[x];
    }
    
    int kruscal(int count){
    	int i;
    	int sum = 0;
    
    	for( i = 1 ; i < maxn ; ++i){
    		father[i] = i;
    	}
    
    	for( i = 0 ; i < count ; ++i ){
    		int fx = find(e[i].begin);
    		int fy = find(e[i].end);
    
    		if(fx != fy){
    			father[fx] = fy;
    			sum += e[i].weight;
    		}
    	}
    
    	return sum;
    }
    
    bool compare(const edge& a , const edge& b){
    	return a.weight < b.weight;
    }
    
    int main(){
    	int n;
    	while(scanf("%d",&n)!=EOF,n){
    		int i;
    		int m = n*(n - 1)/2;
    		memset(father,0,sizeof(father));//尽量加上,否则可能会出现一些问题
    
    		for(i = 0; i < m ; ++i){
    			scanf("%d%d%d",&e[i].begin,&e[i].end,&e[i].weight);
    		}
    
    		sort(e, e + m , compare);
    
    		int sum = kruscal(m);
    
    		printf("%d
    ",sum);
    	}
    }
    
    


  • 相关阅读:
    整数数组中最大子数组的和有溢出如何处理
    返回一个整数数组(环形数组)中最大子数组的和
    cnblogs用户体验评价
    SCRUM报告(一)
    Spring冲刺计划会议
    Spring冲刺计划会议
    团队合作项目----冲刺目标确定
    结队开发
    组队开发----卖书问题
    团队开发---NABC分析
  • 原文地址:https://www.cnblogs.com/pangblog/p/3285776.html
Copyright © 2011-2022 走看看