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

    畅通工程

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 12639 Accepted Submission(s): 5160


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
    行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
     
    Sample Input
    3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
     

    Prim(普里姆算法)

    算法思想:可取图中任意一个顶点V作为生成树的根,之后若要往生成树上添加顶点W,则在顶点V和W之间必定存在一条边。并且该边的权值在所有连通顶点V和W之间的边中取值最小。

    一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边

    import java.util.*;
    import java.io.*;
    public class Main {
    	public static int MAX=Integer.MAX_VALUE;
    	public static int M=102;
    	public static int map[][]=new int[M][M];
    	public static int n,m;
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(new BufferedInputStream(System.in));
    		while(sc.hasNextInt()){
    			n=sc.nextInt();
    			m=sc.nextInt();
    			if(n==0) System.exit(0);
    			for(int i=1;i<M;i++){
    				for(int j=i;j<M;j++){
    					map[i][j]=map[j][i]=MAX;
    				}
    			}
    			for(int i=1;i<=n;i++){
    				int a=sc.nextInt();
    				int b=sc.nextInt();
    				int c=sc.nextInt();
    				if(map[a][b]>c)
    					map[a][b]=map[b][a]=c;
    			}
    			getDistance();
    		}
    	}
    	//Prim(普里姆算法)
    	public static void getDistance(){
    		int k=0,sum=0;
    		int dis[]=new int[M];
    		int mark[]=new int[M];
    		for(int i=2;i<=m;i++){
    			dis[i]=map[1][i];//初始化起点其它点之间的距离
    			mark[i]=0;
    		}
    		mark[1]=1;
    		for(int i=1;i<m;i++){
    			int min=MAX;
    			//每次循环寻找最短的边
    			for(int j=2;j<=m;j++){
    				if(mark[j]==0&&dis[j]<min){
    					min=dis[j];
    					k=j;
    				}
    			}
    			if(min==MAX) {
    				sum=0;
    				break;
    			}
    			mark[k]=1;
    			sum+=dis[k];
    			//到了一个新的点,从新计算到其它点之间的距离
    			for(int j=2;j<=m;j++){
    				if(mark[j]==0&&dis[j]>map[k][j])
    					dis[j]=map[k][j];
    			}
    		}
    		if(sum!=0){
    			System.out.println(sum);
    		}
    		else System.out.println("?");
    	}
    }
    


  • 相关阅读:
    delphi7调用webservice Java 传入参数为空
    delphi客户端调服务器端的java webservice如何在参数中传对象? 转
    DELPHI7如何调用带参数的JAVA WebService
    Delphi调用java开发的WebService,传入参数出错
    cxgrid按条件计算合计值 TcxTreeList计算合计值
    收款凭证
    delphi TCXTreelist 通过代码控制行的可编辑性
    win7 共享
    单到冲回的暂估方式,暂估入库的操作流程是怎样的?
    js常用函数和常用技巧
  • 原文地址:https://www.cnblogs.com/pangblog/p/3246743.html
Copyright © 2011-2022 走看看