服务启动题目
题目
有若干个连续编号的服务(编号从0开始),服务间有依赖关系,启动一个指定服务,请判断该服务是否可以成功启动,并输出依赖的前置服务编号(依赖关系是可传递的,比如服务2依赖于服务1,服务1依赖于服务0,那么服务2依赖于服务1和服务0)。
代码
package huawei;
import java.util.*;
/**
* 有若干个连续编号的服务(编号从0开始),服务间有依赖关系,启动一个指定服务,请判断该服务是否可以成功启动,
* 并输出以来的前置服务编号(依赖关系是可以传递的,比如服务2依赖服务1,服务1依赖于服务0,那么服务2依赖于服务1和服务0)
* 第一行输入为N,N为服务的总个数(1 <= N <= 5000)
* 第二行输入为M,M为指定启动服务的编号(0 <= M < 5000)
* 接下来的N行,是从编号0服务~编号N-1服务的服务依赖表,每一行第一个数字是该服务依赖的服务个数T(0 <= T < 5000),
* 后面T个数字分别是对应的依赖服务编号
*
* @author Sandalphon
* @date 2022/08/18 11:18
**/
public class Test02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(), M = sc.nextInt();
sc.nextLine();
Map<Integer, List<Integer>> dependency = new HashMap<>(N);
for (int i = 0; i < N; i++) {
String[] lines = sc.nextLine().split(",");
if (lines.length == 1) {
dependency.put(i, null);
} else {
LinkedList<Integer> list = new LinkedList<>();
for (int j = 0; j < Integer.valueOf(lines[0]); j++) {
list.add(Integer.valueOf(lines[j + 1]));
}
dependency.put(i, list);
}
}
TreeSet<Integer> ans = new TreeSet<>();
Queue<Integer> queue = new LinkedList<>();
queue.offer(M);
boolean[] visited = new boolean[N];
Arrays.fill(visited, false);
while (!queue.isEmpty()) {
int ele = queue.poll();
visited[ele] = true;
List<Integer> list = dependency.get(ele);
if (list == null) {
visited[ele] = false;
continue;
} else {
for (int t : list) {
// 存在循环依赖
if (visited[t] == true) {
System.out.println(-1);
return;
} else {
if (queue.contains(t)) {
continue;
}
queue.offer(t);
ans.add(t);
}
}
}
}
StringBuffer sb = new StringBuffer();
for (int i : ans) {
sb.append(i + ",");
}
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb);
}
}
通过的测试用例:
第一组测试用例
输入
4
2
0
1,0
1,1
2,0,1
输出
0,1
第二组测试用例
输入
2
1
1,1
1,0
输出
-1
第三组测试用例
输入
4
3
0
2,0,2
0
3,0,1,2
输出
0,1,2