import java.util.*;
class Order{
String orderName;
public Order(String string){
this.orderName = string;
}
}
class OrderDependency{
Order cur;
Order pre;
public OrderDependency(Order pre, Order cur){
this.pre = pre;
this.cur = cur;
}
}
public class Solution {
public static List<Order> solution(List<OrderDependency> orderDependencies){
List<Order> result = new ArrayList<>();
Map<String, Integer> inMap = new HashMap<>();
Map<String, List<String>> outMap = new HashMap<>();
Map<String, Order> recordMap = new HashMap<>();
Set<String> set = new HashSet<>();
for (OrderDependency od : orderDependencies) {
Order pre = od.pre;
Order cur = od.cur;
String preName = pre.orderName;
String curName = cur.orderName;
set.add(preName);
set.add(curName);
if (!recordMap.containsKey(preName)) {
recordMap.put(preName, pre);
}
if (!recordMap.containsKey(curName)) {
recordMap.put(curName, cur);
}
if (!inMap.containsKey(preName)) {
inMap.put(preName, 0);
}
if (inMap.containsKey(curName)) {
inMap.put(curName, inMap.get(curName) + 1);
}
else {
inMap.put(curName, 1);
}
List<String> temp = new ArrayList<>();
if (outMap.containsKey(preName)) {
temp = outMap.get(preName);
}
temp.add(curName);
outMap.put(preName, temp);
if (!outMap.containsKey(curName)) {
outMap.put(curName, new ArrayList<>());
}
}
Queue<String> queue = new LinkedList<>();
for(String str : inMap.keySet()){
int inDegree = inMap.get(str);
if (inDegree == 0) {
queue.offer(str);
}
}
while(!queue.isEmpty()){
String top = queue.poll();
result.add(recordMap.get(top));
List<String> outList = outMap.get(top);
for (String next : outList) {
inMap.put(next, inMap.get(next) - 1);
if (inMap.get(next) == 0) {
queue.offer(next);
}
}
}
if (set.size() != result.size()){
return null;
}
return result;
}
public static void main(String[] args) {
Order o1 = new Order("泡面");
Order o2 = new Order("泡面");
Order o3 = new Order("SF");
Order o4 = new Order("租车");
Order o5 = new Order("SF");
Order o6 = new Order("泡面");
Order o7 = new Order("租车");
Order o8 = new Order("SF");
Order o9 = new Order("爽(每个行为只输出了一次对吧)");
OrderDependency od1 = new OrderDependency(o1, o3);
OrderDependency od2 = new OrderDependency(o2, o7);
OrderDependency od3 = new OrderDependency(o3, o9);
OrderDependency od4 = new OrderDependency(o4, o3);
OrderDependency od5 = new OrderDependency(o6, o9);
OrderDependency od6 = new OrderDependency(o8, o9);
OrderDependency od7 = new OrderDependency(o2, o5);
List<OrderDependency> list = new ArrayList<>();
list.add(od1);
list.add(od2);
list.add(od3);
list.add(od4);
list.add(od5);
list.add(od6);
list.add(od7);
List<Order> res = solution(list);
for (int i = 0; i < res.size(); i++) {
System.out.print(res.get(i).orderName);
if (i+1 < res.size()){
System.out.print(" -> ");
}
}
}
}