zoukankan      html  css  js  c++  java
  • 畅通工程

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
    Output
    对每个测试用例,在1行里输出最小的公路总长度。

    Sample Input
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
    Sample Output
    3
    5

    Hint

    Huge input, scanf is recommended.

    解题思路:并查集的模板题及一点点最小生成树的知识。

    Code:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,pre[1005];
    
    struct node {
    	int x,y,w;
    };
    int find(int x){//找父节点 
    	int r=x;
    	while(pre[r]!=r){
    		r=pre[r];
    	}
    	return r;//find()和join()是并查集的关键代码
    }
    //int find(int x){//这个比上面这个find()更快 
    //	if(pre[x]==x) return x;
    //	else return pre[x]=find(pre[x]);
    //}
    void join(int x,int y){//父节点是否共同,不同则后者变为前者的父节点 
    	int fx=find(x),fy=find(y);
    	if(fx!=fy){
    		pre[fx]=fy;
    	}
    }
    bool cmp(node a,node b){
    	return a.w<b.w;
    }
    int main(){
    	while(~scanf("%d",&n)&&n){
    		memset(pre,0,sizeof(pre)); 
    		for(int i=1;i<=n;i++){
    			pre[i]=i;
    		}
    		node num[5500];
    		int m=n*(n-1)/2;
    		for(int i=0;i<m;i++){
    			scanf("%d%d%d",&num[i].x,&num[i].y,&num[i].w);//没有使用&,会Runtime Error(ACCESS_VIOLATION)
    		}
    		sort(num,num+m,cmp);
    		int sum=0;
    //		for(int i=0;i<n;i++){//这是用来判断有几支队伍 
    //			if(pre[i]==i){
    //				sum++;
    //			}
    //		} 
    		for(int i=0;i<m;i++){
    			if(find(num[i].x)!=find(num[i].y)){
    				join(num[i].x,num[i].y);
    				sum+=num[i].w;
    			}
    		}
    		cout<<sum<<endl;
    		
    	}	
    	
    	return 0;
    }
    
    七月在野,八月在宇,九月在户,十月蟋蟀入我床下
  • 相关阅读:
    mysql drop table & myisam
    python 发送 html email
    python mysqldb 查询返回字典结构
    shell 脚本 连接数据库
    python 中使用map 构建sql查询语句
    C#启动一个外部程序(1)WinExec
    知道在那里划这一条线吗[zt]
    C#启动一个外部程序(2)ShellExecute
    把FlashCom 帮助安装到Flash 8 中文版
    C#读写ini文件
  • 原文地址:https://www.cnblogs.com/voids5/p/12695034.html
Copyright © 2011-2022 走看看