最小生成树

来源:互联网 发布:手机学生模式软件 编辑:程序博客网 时间:2024/05/16 06:46

 package 图;
/*
 最小生成树是用最少的边吧把所有的节点连接起来。
 于是和图的深度优先搜素差不多。
 */
class Stack
{
 private int[] array;
 private int maxSize;
 private int top;
 public Stack(int size)
 {
  maxSize=size;
  array=new int[maxSize];
  top=-1;
 }
 public void push(int key)
 {
  array[++top]=key;
 }
 public int pop()
 {
  return array[top--];
 }
 //查看栈顶的元素
 public int peek()
 {
  return array[top];
 }
 public boolean isEmpty()
 {
  return (top==-1);
 }
 
 
}
class SVertex
{
 private char cData;
  //是否被访问的标记,若用private只能在本类中使用,用public则可在一个包中调用。
 public boolean wasVisited;
  public SVertex(char a)
  {
   cData=a;
   wasVisited=false;
  }
  public char getChar()
  {
   return cData;
  }
}

class Sgraph
{
 private SVertex[] theArray;
 private int nVertexs;
 private int vSize;
 private int[][] adjMat;
 private Stack stack;
 public Sgraph(int size)
 {
  vSize=size;
  theArray =new SVertex[vSize];
  adjMat=new int[vSize][vSize];
  nVertexs=0;
  for(int i=0;i<vSize;i++)
   for(int j=0;j<vSize;j++)
    adjMat[i][j]=0;
  stack=new Stack(20);
 }
 public void addVertex(char key)
 {
  theArray[nVertexs++]=new SVertex(key);
 }
 public void  display()
 {
  for(int i=0;i<nVertexs;i++)
   System.out.print(theArray[i].getChar());
 }
 public void addEndge(int begin,int end)
 {
  adjMat[begin][end]=1;
  adjMat[end][begin]=1;
 }
 public void adjDisplay(int begin,int end)
 {
  System.out.println(" shu zu"+adjMat[begin][end]);
 }
 public void display(int key)
 {
  System.out.println("idata"+theArray[key].getChar()+" ");
 }
 //最小生成树和图的深度优先搜素差不多,
 public void dfs()
 {   
  SVertex ver=theArray[0];
  ver.wasVisited=true;
  //display(0);
  stack.push(0);
  //一步一步
  while(!stack.isEmpty())
  {
   //System.out.println("peek"+stack.peek());
   int current=stack.peek();
   int v=getVertex(current);
   //System.out.println("VVV"+v);
   
   if(v==-1)
    stack.pop();
   else
   {
    theArray[v].wasVisited=true;
    stack.push(v);
    //System.out.println("V"+v);
    display(current);
    display(v);
    
    
    
    
   }
      
  }
  for(int i=0;i<nVertexs;i++)
   theArray[i].wasVisited=false;
 }
 public int getVertex(int key)
 {
  for(int j=0;j<nVertexs;j++)
  {
   //System.out.println("["+key+"]"+"["+j+"]"+adjMat[key][j]);
   //System.out.println(theArray[j].wasVisited);
   if(adjMat[key][j]==1&&theArray[j].wasVisited==false)
    return j;
  }
  return -1;
 }
}
public class mst
{
 public static void main(String[] args)
 {
  Sgraph grap=new Sgraph(10);
  grap.addVertex('A');
  grap.addVertex('B');
  grap.addVertex('C');
  grap.addVertex('D');
  grap.addVertex('E');  
  grap.addEndge(0, 1);
  grap.addEndge(0, 2);
  grap.addEndge(0, 3);
  grap.addEndge(0, 4);
  grap.addEndge(1, 2);
  grap.addEndge(1, 3);
  grap.addEndge(1, 4);
  grap.addEndge(2,3);
  grap.addEndge(2,4);
  grap.addEndge(3,4);
  
  
  
  grap.display();
  System.out.println("visited:");
  grap.dfs();
  System.out.println();
  
  
 }
}

原创粉丝点击