第六周作业3——kruskal算法实现

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");
		}
	}
	
}

//该程序用了边集数组,没有对边集数组按权重排序。
 


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值