最小生成树(Prim)(普利姆最小生成树)

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

import com.sun.corba.se.impl.oa.poa.ActiveObjectMap.Key;
import com.sun.scenario.effect.impl.prism.PrImage;

public class Test {

 static Vertex[] v;
// 就是用于记录用户要输入多少条边关系的,其他没什么╮(╯▽╰)╭
 static int mark = 0;
 static int sum = 0;
 static int[] dis;
 static int key;
 static final int MINVAL = 9999999;
 static int min = MINVAL;
// 用于记录这个顶点是否已经选择过了
 static int[] book;

 public static void main(String[] args) throws FileNotFoundException {
  Scanner scanner = new Scanner(System.in);

  v = new Vertex[scanner.nextInt() + 1];
  dis = new int[v.length];
  book = new int[v.length];
  mark = scanner.nextInt();
 
  for (int i = 0; i < v.length; i++) {
   v[i] = new Vertex();
   // 不过从哪个点开始,一开始默认所有的距离都是MINVAL
   dis[i] = min;
  }
 
 
  int temp1 = 0;
  int temp2 = 0;
  int temp3 = 0;
  Edge edge = null;

  for (int i = 0; i < mark; i++) {
   temp1 = scanner.nextInt();
   temp2 = scanner.nextInt();
   temp3 = scanner.nextInt();

   edge = new Edge(temp1, temp2, temp3);
   v[temp1].getEdges().add(0, edge);
   edge = new Edge(temp2, temp1, temp3);
   v[temp2].getEdges().add(0, edge);
  }
 
  // 假定从1号顶点开始扩展生成树
  book[1] = 1;
  temp1 = v[1].getEdges().size();
  for (int i = 0; i < temp1; i++) {
   edge = v[1].getEdges().get(i);
   dis[edge.getEnd()] = edge.getWeight();
  }
 
  prim();
 
  System.out.println(sum);
 
  scanner.close();
 }

 private static void prim() {
  int count = 0;
 
  while(true){
   min = MINVAL;
   // 先选取出dis中的最小值,这个就是当前最好的顶点,用它来做下一轮的中间点
   for (int i = 0; i < dis.length; i++) {
    if (book[i] == 0 && min > dis[i]) {
     min = dis[i];
     key = i;
    }
   }
   
   book[key] = 1;
   sum += min;
   count++;
   // 本来是应该减1的,但是因为从下标从1开始的关系,所以这里要减2
   if (count == v.length - 2) {
    break;
   }
   // 以中间点为拓展,开始展开下一步的“松弛”
   LinkedList<Edge> edges = v[key].getEdges();
   Edge edge;
   
   for (int i = 0; i < edges.size(); i++) {
    edge = edges.get(i);
// 需要注意的是,这里的book[edge.getEnd()] == 0非常重要,这是为了保证不形成回路的根本。
// 因为当book[edge.getEnd()] == 1时,表明前边已经加其加入生成树之中了,它已经做过中转点了。
// 然后需要注意的就是edge.getWeight() < dis[edge.getEnd()],这里之所以这样写,有两个方面的原因吧。
// 第一个原因:因为dis这时候记录的是下一个可能的中转点到这棵生成树里面每一个节点的距离,所以这样写即可
// 而不是像迪杰斯特拉一样,需要dis[xx] + edge.getWeight() < dis[xxx]这种形式
// 第二个原因嘛:就是注意edge.getEnd()这里不要写成edge.getBegin了,这样的话,你不断改变的都是这是一个地方的dis值
// 而且这个dis的值已经被book【xx】所阻挡了= =
   if (book[edge.getEnd()] == 0 && edge.getWeight() < dis[edge.getEnd()]) {
     dis[edge.getEnd()] = edge.getWeight();
    }
   }
  }
 }
}

class Vertex {
 private LinkedList<Edge> edges = new LinkedList<>();
 private int id;

 public Vertex() {

 }

 public LinkedList<Edge> getEdges() {
  return edges;
 }

 public void setEdges(LinkedList<Edge> edges) {
  this.edges = edges;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

}

class Edge implements Comparable<Edge> {
 private int begin;
 private int end;
 private int weight;

 public Edge() {

 }

 public Edge(int begin, int end, int weight) {
  this.begin = begin;
  this.end = end;
  this.weight = weight;
 }

 public int getBegin() {
  return begin;
 }

 public void setBegin(int begin) {
  this.begin = begin;
 }

 public int getEnd() {
  return end;
 }

 public void setEnd(int end) {
  this.end = end;
 }

 public int getWeight() {
  return weight;
 }

 public void setWeight(int weight) {
  this.weight = weight;
 }

 @Override
 public String toString() {
  return "Edge [begin=" + begin + ", end=" + end + ", weight=" + weight
    + "]";
 }

 @Override
 public int compareTo(Edge o) {
  if (this.weight > o.getWeight()) {
   return 1;
  }
  return -1;
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值