您的位置:首页 > 编程语言 > Java开发

第六周作业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");
}
}

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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息