转动风车java_java实现-图的相关操作

importjava.util.LinkedList;public classGraph {private int vertexSize;//顶点的数量

private int[] vertexs;//顶点数组

private int[][] matrix;//矩阵

private boolean[] isVisited;//是否访问过

private static final int MAX_WEIGHT = 1000;public Graph(intvertexSize){this.vertexSize =vertexSize;

matrix= new int[vertexSize][vertexSize];

vertexs= new int[vertexSize];for(int i = 0;i < vertexSize;i++){

vertexs[i]=i;

}

isVisited= new boolean[vertexSize];

}public intgetVertexSize() {returnvertexSize;

}public void setVertexSize(intvertexSize) {this.vertexSize =vertexSize;

}public int[] getVertexs() {returnvertexs;

}public void setVertexs(int[] vertexs) {this.vertexs =vertexs;

}public int[][] getMatrix() {returnmatrix;

}public void setMatrix(int[][] matrix) {this.matrix =matrix;

}//获取某个顶点的出度

public int getOutDegree(intindex){int[] arr =matrix[index];int degree = 0;for(int i = 0;i < arr.length;i++){if(arr[i] !=0 && arr[i]

degree++;

}

}returndegree;

}//获取两个顶点之间的权值

public int getWeight(int v1,intv2){return matrix[v1][v2] == 0 ? 0 : (matrix[v1][v2] == MAX_WEIGHT ? -1: matrix[v1][v2]);

}//深度优先遍历

private void depthFirstSearch(inti){

isVisited[i]= true;int w =getFirstNeighor(i);while(w != -1){if (!isVisited[w]){//需要遍历该顶点

System.out.println("访问到了 " + w + "顶点");

depthFirstSearch(w);

}

w= getNextNeighor(i,w);//第一个相对于w的邻接点

}

}//对外提供深度优先遍历

public voiddepthFirstSearch(){

isVisited= new boolean[vertexSize];for(int i = 0;i < vertexSize;i++){if(!isVisited[i]){

System.out.println("访问到了 " + i + "顶点");

depthFirstSearch(i);

}

}

isVisited= new boolean[vertexSize];

}//广度优先遍历(使用到了队列)

public voidbroadFirstSearch(){

isVisited= new boolean[vertexSize];for(int i = 0;i < vertexSize;i++){if(!isVisited[i]){

broadFirstSearch(i);

}

}

isVisited= new boolean[vertexSize];

}private void broadFirstSearch(inti){int u;//获取队列的头结点

int w;//获取第一个邻接点

LinkedList queue = new LinkedList<>();

System.out.println("访问到了 " + i + "结点");

isVisited[i]= true;

queue.add(i);while(!queue.isEmpty()){

u=(Integer)(queue.removeFirst()).intValue();

w=getFirstNeighor(u);while(w != -1){if(!isVisited[w]) {

System.out.println("访问到了 " + w + "结点");

isVisited[w]= true;

queue.add(w);

}

w=getNextNeighor(u,w);

}

}

}//获取某个结点的第一个邻接点

public int getFirstNeighor(intindex){for(int i = 0;i < vertexSize;i++){if(matrix[index][i] > 0 && matrix[index][i]

}

}return -1;

}//根据前一个邻接点的下标来获取下一个邻接点(就是根据相对于第一个邻接点获取下一个邻接点)

/** @param v1表示要找的顶点

* @param v2表示该顶点相对于哪个邻接点去获取下一个邻接点

* **/

public int getNextNeighor(int v1,intv2){for(int i = v2 + 1;i < vertexSize;i++){if(matrix[v1][i] > 0 && matrix[v1][i]

}

}return -1;

}//普里母算法

public voidprim(){int[] lowcost = new int[vertexSize]; //最小代价顶点权值的数组,为0表示已经获取到了最小的权值

int[] adjvex = new int[vertexSize]; //放顶点权值

int min = 0;//最小值

int minId = 0;//最小的下标

int sum = 0; //总和

for(int i = 1;i < vertexSize;i++){

lowcost[i]= matrix[0][i];

}for(int i = 1;i < vertexSize;i++){

min=MAX_WEIGHT;

minId= 0;for(int j = 1;j < vertexSize;j++){if(lowcost[j] < min && lowcost[j] > 0){

min=lowcost[j];

minId=j;

}

}//for(int a = 0;a < vertexSize;a++){//System.out.print(adjvex[a] + " ");//}

System.out.println("顶点为:" + adjvex[minId] + ",权值为:" + min + "最小值的下标为:" +minId);

sum+=min;

lowcost[minId]= 0;for(int j = 1;j < vertexSize;j++){if(lowcost[j] != 0 && matrix[minId][j]

lowcost[j]=matrix[minId][j];

adjvex[j]=minId;

}

}

}

System.out.println("最小生成树的权值和为:" +sum);

}public static voidmain(String[] args){

Graph graph= new Graph(9);int[] a1 = new int[]{0,10,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,11,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT};int[] a2 = new int[]{10,0,18,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,16,MAX_WEIGHT,12};int[] a3 = new int[]{MAX_WEIGHT,MAX_WEIGHT,0,22,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,8};int[] a4 = new int[]{MAX_WEIGHT,MAX_WEIGHT,22,0,20,MAX_WEIGHT,24,16,21};int[] a5 = new int[]{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,20,0,26,MAX_WEIGHT,7,MAX_WEIGHT};int[] a6 = new int[]{11,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,26,0,17,MAX_WEIGHT,MAX_WEIGHT};int[] a7 = new int[]{MAX_WEIGHT,16,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,17,0,19,MAX_WEIGHT};int[] a8 = new int[]{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,16,7,MAX_WEIGHT,19,0,MAX_WEIGHT};int[] a9 = new int[]{MAX_WEIGHT,12,8,21,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,0};

graph.matrix[0] =a1;

graph.matrix[1] =a2;

graph.matrix[2] =a3;

graph.matrix[3] =a4;

graph.matrix[4] =a5;

graph.matrix[5] =a6;

graph.matrix[6] =a7;

graph.matrix[7] =a8;

graph.matrix[8] =a9;//System.out.println("出度为:" + graph.getOutDegree(4));//System.out.println("权值:" + graph.getWeight(0,4));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值