拓扑排序解的个数求解

思路:删边回溯法

  • 步骤1:从图中选择一个入度为0的点且输出之
  • 步骤2:从图中删除该节点及其所有出边(即与之相邻的所有点入度-1)

反复执行这两个步骤,直至所有节点都输出,即整个拓扑排序完成;或者直至剩下的图中再没有入度为0的节点,这就说明此图中有回路,不可能进行拓扑排序。

package recovery;

import java.util.*;

public class Main {
	static Scanner in = new Scanner(System.in);
	static int[][] mp = new int[500 + 5][500 + 5];
	static int n = 0, cnt = 0, ans = 0, t = 0, c = 0;
	static int[] deleteEdgs = new int[500 + 5];
	static int[] topo = new int[500 + 5];
	static int[] indegree = new int[500 + 5];
	static int[] a = new int[500 + 5];
	/**
	 * mp图的邻接矩阵
	 * deleteEdgs删除的边=》控制变量cnt
	 * indegree统计顶点的入度
	 * a存储入度为零点的数组=>变量c
	 * */
	static void toposort(int i) {
		if (i>=n) {// 不存在入度数为零的边了
			ans++;
//			for (int j = 0; j  0) {
			n = 0;ans = 0;
			cnt = 0;c = 0;
			Arrays.fill(indegree, 0);
			in.nextLine();
			Set vetex = new HashSet<>();
			String[] edgs = in.nextLine().split(",");
			int x, y, i, j;
			for (i = 0; i < edgs.length; i++) {
				String[] v = edgs[i].split(" ");				
				x = v[0].charAt(0) - 97;
				y = v[1].charAt(0) - 97;
				vetex.add(x);vetex.add(y);
				mp[x][y] = 1;//建图
				indegree[y]++;//
			}
			n = vetex.size();
			for (i = 0; i < n; i++) {
				if (indegree[i] == 0)
					a[c++] = i;
			}
			toposort(0);
			System.out.println(ans);
		}
	}
}

 

你可能感兴趣的:(图论)