码迷,mamicode.com
首页 > 编程语言 > 详细

有向拓扑排序的应用

时间:2014-12-20 22:03:48      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

有向拓扑排序的应用

  首先输入n个点,表示有向图中有n个顶点,接下来n行, 每行输入几个数字,第i行的数字表示它们是顶点i的后继节点,输出要求保证该行的编号要在这几个数前面,当数字为0时,表示i点没有后继节点了。 就是要求输出这个有向图的拓扑序列。
[输入输出][样例]:
Sample Input
5
0
4 5 1 0
1 0
5 3 0
3 0

Sample Output
2 4 5 3 1

package Main;

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

public class Main {

    private int n;
    private int [][]G;//邻接矩阵
    private int [] indegree;//顶点的入度
    private Queue<Integer>que;
    private int [] result;//保存结果
    
    public Main(int n,int [] indegree,int [][]G)
    {
        this.n=n;
        this.indegree = indegree;
        this.G = G;
    }
    
    
    
    
    
    public static void main(String[] args) {
        //输出无前驱的定点优先的拓扑排序,该方法的每一步总是输出当前无前驱的顶点
        Scanner input = new Scanner(System.in);
        int n,x;
        int[][]G;
        int [] indegree;
        while(input.hasNext())
        {
            n = input.nextInt();
            indegree = new int[n+1];
            G = new int[n+1][n+1];
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    x = input.nextInt();
                    if(x == 0)
                    {
                        break;
                    }
                    G[i][x] = 1;
                    indegree[x]++;
                }
            }
            Main ma = new Main(n,indegree,G);
            ma.topoSort();
        }

    }





    private void topoSort() {
        int r=1;
          que = new PriorityQueue< Integer>();
          result=new int[n+1];
          for (int i = 1; i <=n; i++) {
            if (indegree[i] == 0)//入度为0的顶点入队
                que.add(i);
           }

         // for(int i=1;i<=n;i++)
         //   System.out.print(indegree[i]);
          while (!que.isEmpty()) {
             int v = que.poll();//出队
             result[r++]=v;//将v保存到结果集中
             for (int i = 1; i <=n; i++) {//删除顶点v及以v为尾的弧。
                 if (G[v][i] == 1) {
                   indegree[i]--;//模拟删除边
                   if (indegree[i] == 0)
                     que.add(i);
                  }
               }
           }
          for(int i=1;i<=n;i++)
             System.out.print(result[i]+" ");
        
    }

}

 

有向拓扑排序的应用

标签:

原文地址:http://www.cnblogs.com/aicpcode/p/4175872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!