トポロジカルソート(図隣接テーブル記憶)

トポロジカルソートは、このエッジのu vが存在する場合、Uは、Gのグラフの任意の2つの頂点のために、V uは、次に配列がVの前でなければならないように、図Gのすべての頂点が、線形配列で配置させることです配列は、トポロジカル配列と呼ばれ

したがって、トポロジカルソートをするために、図に向けられているがある有向グラフを有する環があるかどうかを決定するために使用され(深さ優先探索は有向グラフを有するリングがあるか否かを判定してもよいが)

次のようにトポロジカルソート処理を行う2.次のとおりです。

①キューを定義し、ノード0のすべてにキューに追加されます

次いで、キューに追加された0である場合、頂点の程度を決定する、最初のチームノード②、出力を削除し、それから発するすべてのエッジを削除し、これらのエッジの頂点が到着ようマイナス1

キューの数が空ノード対の成功または失敗をソートトポロジカル記載正確N、トポロジカルソートである場合③キューが空になるまで②動作が繰り返し実行され、図の環中に存在します。

3.プロセスを完了するには、次のJavaプログラミング言語を使用します。

①私たちは店のマップに隣接テーブルを使用することを選択したマップのストレージの問題を解決するための最初の必要性を、あなたは配列のセットを宣言することができ、各配列要素は、コレクションである、あなたは、アレイが作成したリストを模倣することができます添字は、頂点の数を示します

②ノードは、追加のレコード度ノードの配列を作成する必要があるので、記録する必要がある、とのため、プログラムは、各ノードへの浸透のためのレコードに良い数字を読み取ると

次のようにテストデータは以下のとおりです。

5
6
0 1
0 2
0 3
1 4
2 4
3 4

4.特定のコードは次のように

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
public class Main {
	static int n = 0;
	static int edgesNum = 0;
	static int inDegree[];
	static int count = 0;
	static List<Integer> graph [];
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("输入图中顶点的个数: ");
		n = sc.nextInt();
		inDegree = new int[n];
		System.out.println("输入图中边的条数: ");
		edgesNum = sc.nextInt();
		//创建一个List数组
		graph = new ArrayList[n];
		for(int i = 0; i < n; i++){
			//初始化每一个集合中元素
			graph[i] = new ArrayList<Integer>();
		}
		System.out.println("输入图中边的起始顶点, 结束顶点和顶点之间的权值: ");
		for(int i = 0; i < edgesNum; i++){
			int u = sc.nextInt();
			int v = sc.nextInt();
			graph[u].add(v);
			inDegree[v]++;
		}
		boolean res = topologicalSort();
		if(res){
			System.out.println("拓扑排序成功");
		}else{
			System.out.println("拓扑排序失败");
		}
		sc.close();
	}
	
	private static boolean topologicalSort() {
		Queue<Integer> queue = new LinkedList<Integer>();
		//检查入度为零的顶点
		for(int i = 0; i < n; i++){
			if(inDegree[i] == 0){
				queue.add(i);
				//System.out.println(i);
			}
		}
		while(!queue.isEmpty()){
			int u = queue.poll();
			//输出拓扑排序序列
			System.out.print(u + " ");
			for(int i = 0; i < graph[u].size(); i++){
				int v = graph[u].get(i);
				inDegree[v]--;
				if(inDegree[v] == 0)queue.add(v); 
			}
			//记录访问过的节点的数目
			count++;
		}
		if(count == n) return true;
		return false;
	}
}

 

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/91959284