您的位置:首页 > 其它

这里是有个问题要请教-安慰奶牛的Kruscal算法

2018-03-06 16:40 155 查看
这个题目是来自蓝桥杯的算法训练的一道题,但是下面的代码测试之后只得了10分,大神们帮帮忙看一下到底是什么原因import java.util.*;
class Edge  {
 int u;
 int v;
 int w;
 
 public Edge(int u, int v, int w) {
  this.u = u;
  this.v = v;
  this.w = w;
 } public Edge() {
  // TODO Auto-generated constructor stub
 }
 
}
public class Main2 {
    public static void sort(Edge[] e) {  // 排序算法-按照权值从小到大排序
     Edge edge1=new Edge();
     for(int i=0;i<e.length;i++) {
   for(int j=i;j<e.length;j++) {
    if(e[i].w>e[j].w) {     
     edge1=e[j];
     e[j]=e[i];
     e[i]=edge1;
    }
   }
  }
    }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner s=new Scanner(System.in);
  int N=s.nextInt();
  int P=s.nextInt();
  Edge[] edges=new Edge[P];
  int[] a=new int
;
  for(int i=0;i<N;i++) {
   a[i]=s.nextInt();
  }
  for(int i=0;i<P;i++) {
   int u=s.nextInt();
   int v=s.nextInt();
   int w=s.nextInt();
   Edge edge=new Edge(u,v,2*w);
   edges[i]=edge;
  }
  for(int j=0;j<N;j++) {
   for(int i=0;i<P;i++) {
    if(edges[i].u==j+1) {
     edges[i].w+=a[j];
    }
   }
  }
  for(int j=0;j<N;j++) {
   for(int i=0;i<P;i++) {
    if(edges[i].v==j+1) {
     edges[i].w+=a[j];
    }
   }
  }
  sort(edges);
  //克鲁斯卡尔算法
  Set<Integer> ss=new TreeSet<Integer>();
  int min_sum=edges[0].w;
  for(int i=1;i<P;i++) {     
      if(ss.contains(edges[i].u)&&ss.contains(edges[i].v)) {    //先把最小边的两点存入Set中,再将满足该条件的边值点存入Set
       continue;
      }else {
       min_sum+=edges[i].w;
       ss.add(edges[i].u);
       ss.add(edges[i].v);
      }           
     }
  Arrays.sort(a);    //对Ci进行排序
  System.out.println(min_sum+a[0]);//最后输出的时候要加上Ci最小的值得点
 }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jav 蓝桥 算法