输入m以及n个二元组(u,v),其中m表示元素个数,(u,v)表示表示元素u必须在元素v之前,输出从小到大可能的排序,任意一种即可。
样例输入:
4 30,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();
}
}