有向图的拓扑排序

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

 package 图;
/*
图有两个数组来存储这种关系,一是存储顶点的。一个是存储顶点的关系的。
 有向图的优先级排序。实例:课程的优先关系。
 有两个步骤:
 1.找到一个没有后继结点
 2.从图中删除这个节点,在列表的前面插入顶点的标记
 重复操作1,2直到所有的元素被删除。
 */
class TVertex
{
   public char label;
   public boolean wasVisited;
   public TVertex(char c)
   {
    label=c;
    wasVisited=false;
   }
}
 class Tgraph
{
    private final int MAX_VERS=20;
    private TVertex[] TArray;
    private int[][] adjMat;
    private int nElems;
    private char[] sortedArray;
    public Tgraph()
    {
     nElems=0;
     TArray=new TVertex[MAX_VERS];
     adjMat=new int[MAX_VERS][MAX_VERS];
     for(int i=0;i<MAX_VERS;i++)
      for(int j=0;j<MAX_VERS;j++)
       adjMat[i][j]=0;
     sortedArray=new char[MAX_VERS];
    }
    public void addVer(char c)
    {
     TArray[nElems++]=new TVertex(c);
    }
    public void addEdge(int start,int end)
    {
        adjMat[start][end]=1; 
    }
   
    public void topo()
    {
     int sum=nElems;
     while(nElems>0)
     {
      //得到最后一个节点
      int currentVertex=noSuccessors();
      if(currentVertex==-1)
      {
       System.out.println("ERROR:graph has cycles");
       return;
      }
      //在元素数组中删除内容
      sortedArray[nElems-1]=TArray[currentVertex].label;
      //在关系数组中删除它所在的行和列
      delete(currentVertex);
     }
     System.out.println("da yin");
     for(int i=0;i<sum;i++)
      
      System.out.print(sortedArray[i]);
     
     System.out.println();
    }
  //得到最后一个节点
    public int noSuccessors()
    {
     boolean isEdge;
     //row是起始点,col是终点
     for(int row=0;row<nElems;row++)
     {
         isEdge=false;
         for(int col=0;col<nElems;col++)
         {
          if(adjMat[row][col]>0)
          {
           isEdge=true;
           break;
          }
         }
         if(!isEdge)
          return row;
     }
     return -1;
    }
   
   
    public void delete(int key)
    {
     if(key!=nElems-1)
     {
      for(int j=key;j<nElems;j++)
      {
       TArray[j]=TArray[j+1];
      }
      for(int row=key;row<nElems;row++)
       moveRowUp(row,nElems);
      for(int col=key;col<nElems;col++)
       moveColUp(col,nElems);
      
      
     }
     nElems--;
    }
    public void moveRowUp(int row,int length)
    {
     for(int col=0;col<length;col++)
      adjMat[row][col]=adjMat[row+1][col];
    }
    public void moveColUp(int row,int length)
    {
     for(int col=0;col<length;col++)
      adjMat[row][col]=adjMat[row][col+1];
    }
}
 public class topo
 {
  public static void main(String[] args)
  {
   Tgraph graph=new Tgraph();
   graph.addVer('A');
   graph.addVer('B');
   graph.addVer('C');
   graph.addVer('D');
   graph.addVer('E');
   graph.addVer('F');
   graph.addVer('G');
   graph.addVer('H');
   graph.addEdge(0,3);
   graph.addEdge(0,4);
   graph.addEdge(1,4);
   graph.addEdge(2,5);
   graph.addEdge(3,6);
   graph.addEdge(4,6);
   graph.addEdge(5,7);
   graph.addEdge(6,7);
   graph.topo();
  
  
  }
 }

原创粉丝点击