- 浏览: 600371 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
import java.util.Scanner; 方法一:时间复杂度O(n^3) class Edge { /** * 边的起点 */ char vexa; /** * 边的终点 */ char vexb; /** * 边的权植 */ int weight; Edge(char vexa, char vexb, int weight) { this.vexa = vexa; this.vexb = vexb; this.weight = weight; } } public class MST { int n; int m; Edge[] e ; public MST(int n,int m,Edge[] e){ this.n=n; this.m=m; this.e=e; } /** * w函数 * @param x 起点序号 * @param y 终点序号 * @return 返回起点序号为x,终点序号为y的边的权植。如果没有这条边就返回无穷大 */ private int w(int x, int y) { char from = (char) (x + 97); char to = (char) (y + 97); for (int i = 0; i < m; i++) { if (e[i].vexa == from && e[i].vexb == to) { return e[i].weight; } if (e[i].vexa == to && e[i].vexb == from) { return e[i].weight; } } return Integer.MAX_VALUE; // 用Integer.MAX_VALUE代表无穷大 } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt();//图的顶点数 int m = sc.nextInt(); //图的边数 if (n == 0 && m == 0) break; Edge[] e=new Edge[m]; for (int i = 0; i < m; ++i) { int u = sc.nextInt(); int v = sc.nextInt(); int w = sc.nextInt(); e[i]=new Edge((char)(u+97),(char)(v+97),w); } MST mst=new MST(n,m,e); Edge[] ee =mst.prime(); //存放最小生成树的n-1条边 for (int i = 0; i < n - 1; ++i) { System.out.println(ee[i].vexa + " " + ee[i].vexb + " " + ee[i].weight); } } } public Edge[] prime(){ Edge[] e=new Edge[n];//存放最小生成树的n-1条边 // 表示已经加入最小生成树(mst)的结点, 数组元素从0到n-1分别对应结点a到(char)(n-1+97) // 如果vex_mst[i]=0,表示对应结点没有加入到mst // 如果vex_mst[i]=1,表示对应结点已经加入到mst int[] vex_mst = new int[n]; for (int i = 0; i < n; i++) // 初始化 vex_mst[i] = 0; vex_mst[0] = 1; // 设置初始结点为a // 将n-1条边加入到最小生成树 for (int i = 0; i < n-1; i++) { // 加入一条边。 // 这条边的两个结点一个在mst中,而另一个不在mst中而且具有最小权植 int add_vex = 0; // 选中的结点 int min_weight = Integer.MAX_VALUE; // 最小权植,初始值为Integer.MAX_VALUE Edge adde = new Edge(' ', ' ', 0); for (int j = 0; j < n; j++) if (vex_mst[j] == 1) { // j是mst中的结点 for (int k = 0; k < n; k++) { if (vex_mst[k] == 0 && w(j, k) < min_weight) { add_vex = k; min_weight = w(j, k); adde.vexa = (char) (j + 97); adde.vexb = (char) (k + 97); adde.weight = w(j,k); } } } vex_mst[add_vex] = 1; // 将选择的结点加入mst e[i]=adde; } return e; } }
运行:
C:\aaa>java MST
5 8
0 1 2
1 4 9
4 3 7
3 0 10
0 2 12
2 4 3
1 2 8
2 3 6
a b 2
b c 8
c e 3
c d 6
方法二:时间复杂度O(n^2)
import java.io.BufferedInputStream; import java.util.Scanner; import java.util.Arrays; public class PrimTest{ private int[][] arr;//邻接矩阵 private boolean flag[]; //用来标记节点i是否已加入到MST private int n; //顶点数 private int sum;//最小权值和 static final int maxInt = Integer.MAX_VALUE; public PrimTest(int[][] arr,int n){ this.arr=arr; this.n=n; flag=new boolean[n]; } public static void main(String[] args) { Scanner s = new Scanner(new BufferedInputStream(System.in)); int n = 7; int arr[][] = {{maxInt,28, maxInt,maxInt,maxInt, 10, maxInt}, {28, maxInt,16, maxInt,maxInt, maxInt,14 }, {maxInt,16, maxInt,12, maxInt, maxInt,maxInt}, {maxInt,maxInt,12, maxInt,22, maxInt,18 }, {maxInt,maxInt,maxInt,22, maxInt, 25, 24 }, {10, maxInt,maxInt,maxInt,25, maxInt,maxInt}, {maxInt,14, maxInt,18, 24, maxInt,maxInt}}; System.out.println(new PrimTest(arr,n).prim()); } public int prim(){ sum = 0; flag[0] = true; //选取第一个节点 int mst[]=new int[n];//存储最小权值边的起点 Arrays.fill(mst,0);//最小权值边的起点默认为0 for(int k=1; k<n; k++){ //循环n-1次 int min = maxInt,min_i = 0; for(int i=0; i<n; i++){//选一条权值最小的。 if( !flag[i] && arr[0][i] < min){ min = arr[0][i]; min_i = i; } } flag[min_i] = true; //加入 System.out.print("边"+mst[min_i]+"-"+min_i); for(int i=0; i<n; i++){ //更新 if( !flag[i] && arr[0][i] > arr[min_i][i]){//若同一个未加入点与多个已加入点相连接,取权值较小的。 arr[0][i] = arr[min_i][i]; mst[i] = min_i;//更新最小权值边的起点 } } System.out.println("--"+arr[0][min_i]); sum += arr[0][min_i];//加上权值 } return sum; } }
运行:
边0-5--10
边5-4--25
边4-3--22
边3-2--12
边2-1--16
边1-6--14
99
下载源码:
发表评论
-
图的深搜+回溯练习题:POJ2197
2013-01-18 15:53 1644POJ 2197题意: 给定n个城市及其之间的距离,以及距 ... -
图的练习题(有解答)
2012-12-27 22:23 26521. 填空题 ⑴ 设无向图G ... -
邻接表实现图的广搜和深搜(java模板)
2012-12-11 17:04 2452//邻接表实现图的广搜和深搜(java模板) impor ... -
邻接矩阵实现图的广搜和深搜(java模板)
2012-12-10 20:37 1909经常要用到,放到这里备用!! //邻接矩阵实现图的广搜和深搜 ... -
如何求无向图的最小环
2012-11-13 19:02 2778POJ1734 题意:给定一个N个点的无向图,求一个最小环(各 ... -
深度优先搜索输出有向图中的所有环(JAVA)
2012-11-06 14:22 9618如图:求出有向图的所有环。 import java.uti ... -
三种算法(Floyd、Dijkstra、SPFA)求单源点最短路径。
2012-11-05 13:15 1845题(HDU2544): 在每年的校赛里,所有进入决赛 ... -
Dijkstra算法解HDU1874
2012-11-05 10:15 1343Dijkstra算法是用来解 ... -
SPFA算法求单源最短路径
2012-11-04 23:00 1922很多时候,给定的图存在负权边,这时类似Dijkstra等算法 ... -
图解Bellman-Ford算法
2012-11-03 19:39 5922Bellman-Ford算法: ... -
Bellman-Ford算法教学PPT
2012-11-03 12:06 1451Dijkstra算法是处理单源最短路径的有效算法,但它 ... -
昆虫的同性恋
2012-11-01 19:21 1393题目大意: 输入一个数t,表示测试组数。然后每组第一行两 ... -
拓扑排序入门练习
2012-11-01 16:51 1576拓扑排序简单来说 ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4043一、什么是并查集 ... -
无前趋的顶点优先的拓扑排序方法(JAVA)
2012-10-28 20:20 1856无前趋的顶点优先的拓扑排序方法 该方法的每一步总是输 ... -
Kruskal算法和prim算法求最小生成树学习小结(JAVA)
2012-10-26 14:02 5037prim算法是用来实现图最小生成树的2种常用方法之一,P ... -
图的邻接表存储及遍历(JAVA)
2012-10-10 10:58 5420为图的每个顶点所发出的边建立一个单链表,用一顶点数组存储 ... -
弗洛伊德(Floyd)算法求任意两点间的最短路径
2012-10-01 07:46 6289Floyd-Warshall算法(Floyd-Warsha ... -
单源最短路径( Dijkstra算法)JAVA实现
2012-09-14 14:30 9109单源最短路径问题,即在图中求出给定顶点到其它任一顶 ... -
深度优先搜索与有向无环图的拓扑排序(java实现)
2012-09-11 13:05 5519当每个任务有前后置关系时,需要找到一种满足前后置关系的路 ...
相关推荐
Jupyter-Notebook
Jupyter-Notebook
高效甘特图模板下载-精心整理.zip
lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance
OpenGL调试工具,适合图形开发者,包括视频开发,播放器开始以及游戏开发者。
全国行政区划shp最新图.zip
全国研究生招生与在校数据+国家线-最新.zip
Jupyter-Notebook
直播电商交流平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本
2000-2020年沪深A股上市公司融资约束程度SA指数-最新数据发布.zip
PPT模版资料,PPT模版资料
CPA注会考试最新教材资料-最新发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文提供了一个完整的职工管理系统的C++源代码。通过面向对象的编程方法,实现了包括创建新职工、查询、增加、修改、删除、排序、统计以及存储和恢复职工数据在内的多个基本操作功能。该系统支持不同的用户角色(如管理员与老板),并通过菜单驱动方式让用户方便地进行相关操作。此外,还包括了错误检测机制,确保操作过程中的异常得到及时处理。 适合人群:有一定C++语言基础,特别是面向对象编程经验的程序员;企业管理人员和技术开发人员。 使用场景及目标:适用于中小型企业内部的人力资源管理部门或IT部门,用于维护员工基本信息数据库,提高工作效率。通过本项目的学习可以加深对链表、类和对象的理解。 阅读建议:建议先熟悉C++的基本语法和面向对象概念,再深入学习代码的具体实现细节。对于关键函数,比如exchange、creatilist等,应当重点关注并动手实践以加强理解。
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
Huawei-HKUST Joint Workshop on Theory for Future Wireless 15-16 September 2022 华为-香港科技大学未来无线理论联合研讨会 Speaker:Jingwen Tong
演出人员与观众疫情信息管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本.pdf