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