【java】拓扑排序

来源:互联网 发布:java.util.*是什么包 编辑:程序博客网 时间:2024/06/08 01:04

输入m以及n个二元组(u,v),其中m表示元素个数,(u,v)表示表示元素u必须在元素v之前,输出从小到大可能的排序,任意一种即可。

样例输入:

4 3
0,1
2,1
3,2

2 2
1,0
0,1

样例输出:

3201

false

基于DFS的拓扑排序算法:

import java.util.Scanner;import java.util.Arrays;public class Main {public static StringBuffer topoStr=new StringBuffer();public static boolean dfs(int [][]edg,int []visited,int index){visited[index]=-1;for(int i=0;i<visited.length;i++){if(edg[index][i]==1){if(visited[i]==-1)return false;else if(visited[i]==0)if(!dfs(edg,visited,i))return false;}}visited[index]=1;topoStr.append(index);return true;}public static void main(String[] args){Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){topoStr.setLength(0);int m=scanner.nextInt();int n=scanner.nextInt();int []visited=new int[m];Arrays.fill(visited, 0);scanner.nextLine();int [][]edg=new int[m][m];for(int []arr:edg){Arrays.fill(arr, 0);}for(int i=0;i<n;i++){String s=scanner.nextLine();String []temp=s.split(",");int a=Integer.parseInt(temp[0]);int b=Integer.parseInt(temp[1]);edg[a][b]=1;}for(int i=0;i<m;i++){if(visited[i]==0){if(dfs(edg,visited,i))continue;else{System.out.println("false");break;}}}System.out.println(topoStr.reverse().toString());}scanner.close();}}

Kahn算法:

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Arrays;public class Main {public static void main(String[] args){Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){StringBuffer topoStr=new StringBuffer();int m=scanner.nextInt();int n=scanner.nextInt();int []visited=new int[m];int []inDegree=new int[m];Arrays.fill(visited, 0);Arrays.fill(inDegree, 0);scanner.nextLine();int [][]edg=new int[m][m];for(int []arr:edg){Arrays.fill(arr, 0);}for(int i=0;i<n;i++){String s=scanner.nextLine();String []temp=s.split(",");int a=Integer.parseInt(temp[0]);int b=Integer.parseInt(temp[1]);edg[a][b]=1;inDegree[b]++;}Queue<Integer> queue=new LinkedList<Integer>();for(int i=0;i<m;i++){if(inDegree[i]==0){visited[i]=1;queue.offer(i);}}while(!queue.isEmpty()){int i=queue.poll();topoStr.append(i);for(int j=0;j<m;j++){if(edg[i][j]==1)inDegree[j]--;}for(int j=0;j<m;j++){if(visited[j]==0&&inDegree[j]==0){visited[j]=1;queue.offer(j);}}}if(topoStr.length()==m){System.out.println(topoStr.toString());}else{System.out.println("false");}}scanner.close();}}



0 0
原创粉丝点击