ACM_38布线问题

来源:互联网 发布:少年维特之烦恼知乎 编辑:程序博客网 时间:2024/05/22 09:05

布线问题

时间限制:1000 ms  内存限制:65535KB
难度:4
描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
2、所用电线花费最少
输入
第一行是一个整数n表示有n组测试数据。(n<5)
每组测试数据的第一行是两个整数v,e.
v表示学校里楼的总个数(v<=500)
随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0
(楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
数据保证至少存在一种方案满足要求。
输出
每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
样例输入
14 61 2 102 3 103 1 101 4 12 4 13 4 11 3 5 6
样例输出
4
来源
[张云聪]原创
上传者
张云聪
最小生成树问题具体原理不解释,  K。。算法: 每次找最小边  Prim算法 每次找最小邻接点



public class ArrangeLine {

    publicstatic void main(String[] args) {
       ArrangeLine arrangeLine = new ArrangeLine();
       arrangeLine.solution();
    }

    public voidsolution() {
       in = newScanner(System.in);
       int groups =in.nextInt();
       for (int i =0; i < groups; i++) {
         getData();
          int result =handle();
         System.out.println(result);
       }
    }
   
    Scannerin;
    Node[]nodelist;
    intbuildings;
    intLines;
    intmin_input;
    //获取数据
    private voidgetData(){
       buildings =in.nextInt();
       Lines =in.nextInt();
      
       nodelist =new Node[Lines];
      
       for(int i =0 ; i < Lines;i++){
          nodelist[i]= new Node(in.nextInt(),in.nextInt(),in.nextInt());
       }
       min_input =Integer.MAX_VALUE;
       intinvalue;
       for(int i =0 ; i < buildings ;i++){
          invalue =in.nextInt();
          min_input =min_input > invalue? invalue: min_input;
       }
    }
   
    //处理数据
    private inthandle(){
      Arrays.sort(nodelist);
      int[]  map = new int[buildings+1];
       for(int i =0 ; i < map.length ;i++){
          map[i] =i;
       }
       int count =0;
       intreval=0;
       for(int i =0 ; i < nodelist.length;i++ ){
          if(map[nodelist[i].vertex1] != map[nodelist[i].vertex2]){
             int temp=map[nodelist[i].vertex2];
             for(int j =1 ; j < map.length ;j++){
                if(map[j] ==temp){
                   map[j] =map[nodelist[i].vertex1];
                }
             }
             reval +=nodelist[i].cost;
            count++;
             if(count ==(buildings-1)){
                break;
             }
          }
       }
      System.out.println();
       returnreval+min_input;
    }
   
    class Nodeimplements Comparable{
      int  vertex1;
      int  vertex2;
      int  cost;
      
       publicNode(int vertex1 , int vertex2,int cost){
          if(vertex1> vertex2){
             this.vertex1= vertex2;
             this.vertex1= vertex1;
          }else{
             this.vertex1= vertex1;
             this.vertex2= vertex2;
          }
         
          this.cost =cost;
       }
      
      @Override
       public intcompareTo(Node o) {
      
          if(cost <o.cost){
             return-1;
          }
          return1;
       }
    }
}



性能不容乐观   需要在时间和空间2方面都进行优化

0 0
原创粉丝点击