第六周作业3——kruskal算法实现
2014-04-27 19:40
337 查看
package progrem; import java.io.BufferedReader; import java.io.FileReader; import java.util.Scanner; class Edge { private int formvex;//边的起点 private int endvex;//边的终点 private int weight;//权重 public int getFromvex(){ return formvex; } public void setFormvex(int formvex){ this.formvex = formvex; } public int getEndvex(){ return endvex; } public void setEndvex(int endvex){ this.endvex = endvex; } public int getWeight(){ return weight; } public void setWeight(int weight){ this.weight = weight; } public Edge(){ } } class Arcnode { private int adjvex; private Arcnode nextArc; public int getAdjvex(){ return adjvex; } public void setAdjvex(int adjvex){ this.adjvex = adjvex; } public Arcnode getNextArc(){ return nextArc; } public void setNextArc(Arcnode nextArc){ this.nextArc = nextArc; } } public class Kruskal { private Edge edge[]; //边集数组 private Edge storeEdge[];//存放树中的边 private int adjNum;//顶点链接表 private int edgeNum;//图中边的总数 public static void main(String []args) { Kruskal ks = new Kruskal(); ks.InitEdge(); ks.kruscal(); ks.outPut(); } public void InitEdge(){ try{ String readStr = null; String storeStr[]; int firstAdj; int endAdj; int weight; int i=0; FileReader fr = new FileReader("C:/Users/Y470/Desktop/tree.txt"); BufferedReader br = new BufferedReader(fr); //读取第一行,并初始化边数与顶点数 storeStr = new String[3]; readStr = br.readLine().trim(); storeStr = readStr.split(" "); adjNum = Integer.parseInt(storeStr[0]); edgeNum = Integer.parseInt(storeStr[1]); edge = new Edge[edgeNum]; storeEdge = new Edge[adjNum-1]; readStr = br.readLine().trim(); while(readStr != null && i<edgeNum){//读取信息初始化边表数组 storeStr = readStr.split(" ");//仪空格分割读取的文本 firstAdj = Integer.parseInt(storeStr[0]); endAdj = Integer.parseInt(storeStr[1]); weight = Integer.parseInt(storeStr[2]); edge[i] = new Edge(); edge[i].setFormvex(firstAdj); edge[i].setEndvex(endAdj); edge[i].setWeight(weight); i++; readStr = br.readLine(); } }catch(Exception e){ e.printStackTrace(); } } public void kruscal(){ int k = 1;//表示带获取的最小生成树中的边数 初值为1 int d = 0;//edge中的带扫描元素的下标位置 int m1 = -1,m2 = -1;//分别表示记录一条边的了两个顶点的所在集合的序号,就是两标记 int i; Arcnode p; Arcnode s[] = new Arcnode[adjNum+1]; for(i=0;i<adjNum;i++){//初始化数组s[]分割成单个的顶点 p = new Arcnode(); p.setAdjvex(i); p.setNextArc(null); s[i] = p; } //进行n-1次循环,得到最小生成树中的n-1条边 while(k<adjNum && d<edge.length){ for(i=0;i<adjNum;i++){ p = s[i]; while(p != null){ if(d<edge.length && p.getAdjvex() == edge[d].getFromvex()) m1 = i; if(d<edge.length && p.getAdjvex() == edge[d].getEndvex()) m2 = i; p = p.getNextArc(); } } if(m1 != m2 && m1 != -1 && m2 != -1) {//若两个集合序号不等,则表明edge【d】是生成树上的一条边,,将他存放到storeEdge中 storeEdge[k-1] = edge[d]; k++; //合并两个集合,并将另一个置为空集 p = s[m1]; while(p.getNextArc() != null) p = p.getNextArc(); p.setNextArc(s[m2]); s[m2] = null; } d++; } } public void outPut(){ System.out.println("Kruskal算法最小生成树"); System.out.print("起始顶点:"+"\t"); for(int i=0;i<adjNum-1;i++){ System.out.print(storeEdge[i].getFromvex()+"\t"); } System.out.println(); System.out.print("终点:"+"\t"); for(int i=0;i<adjNum-1;i++){ System.out.print(storeEdge[i].getEndvex()+"\t"); } System.out.println(); System.out.print("权重:"+"\t"); for(int i=0;i<adjNum-1;i++){ System.out.print(storeEdge[i].getWeight()+"\t"); } } }
//该程序用了边集数组,没有对边集数组按权重排序。
相关文章推荐
- 第六周作业—哈夫曼编码实现
- 第六周作业2——哈夫曼编码实现
- 第六周作业——1.利用哈夫曼编码英文字母表,2哈夫曼编码实现
- 第六周作业2——哈夫曼编码实现
- 第六周作业——编码实现哈夫曼树
- 第六周作业——1.利用哈夫曼编码英文字母表,2哈夫曼编码实现
- 第六周作业二——编程实现矩阵乘法运算
- spring中如何使用quartz实现定时作业
- 团队第4次作业:软件实现与测试
- POJ 3522 变形kruskal算法及并查集的实现
- 如何让你的作业在Hadoop集群中真正实现分布式运行
- 有关截取歌词中字符串的作业(用工程实现)
- Quartz.NET实现作业调度
- 第六周作业1——利用哈夫曼编码英文字母表
- 《JAVA高级程序设计》第六周作业
- [IMWeb训练营作业]vue实现简单的todo list
- 第三周作业-实现随机点名的签到程序
- Quartz.NET实现作业调度
- 使用Quartz实现作业调度(二)