• 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("?");
    	}
    }
    


  • 相关阅读:
    be accustomed to doing|actual |acute|adapt |
    By virtue of|sustain|post |scrape off |stretch|access to|take into account of|exploit|hasten|blur |idle|bored her to|account for|accused of|cruelty
    Block to|wreck|Range|Reach|span|chase around|amuse|exploit |instructed
    blast -m1
    qdel
    uname|mv|tar -xzvf|
    Hypothesis Tests for One Population Mean When σ Is Unknown|other
    dll显示调用和隐式调用
    使用预编译头提高编译速度
    NMS过程图示
  • 原文地址:https://www.cnblogs.com/pangblog/p/3246743.html
Copyright © 2020-2023  润新知