拓扑排序

package com.huizhong;

 

import java.util.*;

public class tuoPoSort {

   

           static int[][] Graph;

           static int[] Sum;

           static boolean[] Finish;

           static int n;

           static int[] Temp;

           public static void  main(String[] args){

              tuoPoSort tps=new tuoPoSort();

              tps.input();

              tps.rudu();

              tps.sort();

              tps.print();

           }

           /*

            * 输入有向图的邻接矩阵

            */

                  public void input(){

              Scanner sc=new Scanner(System.in);

              System.out.println("********拓扑排序的实现***********");

              System.out.println("请输入有向图中顶点的个数:");

              n=sc.nextInt();

              if(n>2){

               Graph=new int [n][n];

               Sum=new int[n+1];

           for(int i=0;i<n;i++){

              System.out.println("请输入第"+(i+1)+"顶点与其他顶点的关系   例如: 0    1");

              for(int j=0;j<n;j++){

                      Graph[i][j]=sc.nextInt();

                  }

               }

              }else{

                  System.out.println("你输入的数据不合理:");

                  System.exit(0);

          

              }

           }

           /*

            * 计算其入度

            */

           public void rudu(){

              for(int i=0;i<n;i++){//i控制矩阵的列

                     for(int j=0;j<n;j++){//j控制矩阵的行

                         Sum[i]+=Graph[j][i];

                  }

              }

                  System.out.println();

                  System.out.println();

                  System.out.println("输出各顶点入度和:");

                  for(int i=0;i<n;i++){

                     System.out.println(" "+i+"个顶点的入度和:"+Sum[i]);

                    

                  }

           }

           /*

            * 给顶点排序,找出拓扑序列

            */

           public void sort(){

              Temp=new int[n];//保存找到的符合其意的顶点

              Finish=new boolean [n];

              int k=0;//找到的符合其意的顶点

              for(int i=0;i<n;i++){

                  if(Sum[i]==0&&Finish[i]==false){

                         Temp[k]=i;

                         k++;

                         Finish[i]=true;

                         for(int j=0;j<n;j++){

                            if( Graph[i][j]==1){

                             Graph[i][j]=0;

                             Sum[j]=Sum[j]-1;

                            }

                         }

                         i=-1;//返回循环

                  }

              }

              if (k<n-1) {

                  System.out.println("对不起!!存在环,没有拓扑序列!!!");

                    System.exit(0);

              }

           }

           /*

            * 输出拓扑序列

            */

           public void print(){

              System.out.println();

              System.out.println();

              System.out.println("********拓扑排序的结果***********");

              System.out.println("存在拓扑序列为:");

              for(int i=0;i<n;i++){

                  System.out.print(Temp[i]+"--->> ");

              }

             

           }

    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值