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"); } } }
//该程序用了边集数组,没有对边集数组按权重排序。
第六周作业3——kruskal算法实现
最新推荐文章于 2022-11-15 09:22:44 发布