Description
牛客网 2018校招真题 带权的DAG节点排序
Solving Ideas
拓扑排序
Time complexity :
O
(
n
)
O(n)
O(n)
Space complexity :
O
(
n
+
e
)
O(n+e)
O(n+e)
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
class Vertex {
int lable; //标号
int weight; //权值
int in; //入度
ArrayList<Vertex> connectList; //该顶点所指向的点
Vertex(int lable, int weight) {
this.lable = lable;
this.weight = weight;
this.connectList = new ArrayList<Vertex>();
}
}
/**
* 拓扑排序
*
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strs = br.readLine().split(" ");
int n = Integer.parseInt(strs[0]), e = Integer.parseInt(strs[1]);
//建图
HashMap<Integer, Vertex> dag = new HashMap<Integer, Vertex>();
for (int i = 0; i < n; i++) {
strs = br.readLine().split(" ");
int lable = Integer.parseInt(strs[0]), weight = Integer.parseInt(strs[1]);
dag.put(lable, new Vertex(lable, weight));
}
for (int i = 0; i < e; i++) {
strs = br.readLine().split(" ");
int from = Integer.parseInt(strs[0]), to = Integer.parseInt(strs[1]);
dag.get(from).connectList.add(dag.get(to));
dag.get(to).in++;
}
ArrayList<Integer> res = topologicalSort(dag);
for (int i = 0; i < res.size() - 1; i++) {
System.out.print(res.get(i) + " ");
}
System.out.println(res.get(res.size() - 1));
}
private static ArrayList<Integer> topologicalSort(HashMap<Integer, Vertex> dag) {
ArrayList<Integer> res = new ArrayList<>();
//大顶堆
PriorityQueue<Vertex> queue = new PriorityQueue<>(new Comparator<Vertex>() {
@Override
public int compare(Vertex o1, Vertex o2) {
return -Integer.compare(o1.weight, o2.weight);
}
});
//入度为0的点入队
for (Integer lable : dag.keySet()) {
if (dag.get(lable).in == 0) queue.offer(dag.get(lable));
}
while (!queue.isEmpty()) {
Vertex fromV = queue.poll();
res.add(fromV.lable);
for (Vertex toV : dag.get(fromV.lable).connectList) {
toV.in--; //邻接点入度减1
if (toV.in == 0) queue.offer(toV);
}
}
return res;
}
}