- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
java解法
第一行输入依赖关系(格式如A-B,B-C),解析为依赖对列表rels。
第二行输入故障服务(格式如A,C),解析为故障服务列表fails。
构建依赖关系映射:
使用depMap记录服务之间的依赖关系,键是被依赖的服务,值是依赖该服务的服务集合。
使用orderMap记录服务的输入顺序,用于最终按顺序输出。
故障传播:
对于每个故障服务,使用栈遍历其依赖的所有服务,将受影响的服务标记为故障。
筛选未受影响的服务:
遍历所有服务,排除被标记为故障的服务,得到仍然可用的服务列表。
按输入顺序输出:
对剩下的可用服务列表,按照orderMap中记录的顺序排序并输出。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String relInput = sc.nextLine();
List<String> relPairs = split(relInput, ',');
List<Pair<String, String>> rels = new ArrayList<>();
for (String pStr : relPairs) {
List<String> p = split(pStr, '-');
rels.add(new Pair<>(p.get(0), p.get(1)));
}
String failInput = sc.nextLine();
List<String> fails = split(failInput, ',');
System.out.println(getActive(rels, fails));
}
public static List<String> split(String s, char d) {
return Arrays.asList(s.split(String.valueOf(d)));
}
public static String getActive(List<Pair<String, String>> rels, List<String> fails) {
Map<String, Set<String>> depMap = new HashMap<>();
Set<String> failSet = new HashSet<>(fails);
Map<String, Integer> orderMap = new HashMap<>();
int idx = 0;
for (Pair<String, String> rel : rels) {
String dep = rel.getKey();
String prov = rel.getValue();
depMap.computeIfAbsent(prov, k -> new HashSet<>()).add(dep);
orderMap.putIfAbsent(dep, idx++);
orderMap.putIfAbsent(prov, idx++);
}
for (String fail : fails) {
Stack<String> stk = new Stack<>();
stk.push(fail);
while (!stk.isEmpty()) {
String svc = stk.pop();
if (depMap.containsKey(svc)) {
for (String dep : depMap.get(svc)) {
if (!failSet.contains(dep)) {
failSet.add(dep);
stk.push(dep);
}
}
depMap.remove(svc);
}
}
}
List<String> operList = new ArrayList<>();
for (Map.Entry<String, Integer> entry : orderMap.entrySet()) {
if (!failSet.contains(entry.getKey())) {
operList.add(entry.getKey());
}
}
if (operList.isEmpty()) {
return ",";
}
operList.sort(Comparator.comparingInt(orderMap::get));
return String.join(",", operList);
}
public static class Pair<K, V> {
private final K key;
private final V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
C++解法
第一行输入描述服务之间的依赖关系(如 A-B,B-C),将其解析为relations列表,存储为键值对(dependent 和 provider)。
第二行输入故障服务列表(如 A,C),将其存储为字符串列表failures。
构建依赖图和服务顺序:
使用 dependencyMap 记录服务之间的依赖关系:
键是被依赖的服务,值是依赖该服务的服务集合。
使用 appearanceOrder 记录每个服务首次出现的顺序,用于最终结果排序。
模拟故障传播:
对于每个故障服务,使用栈(DFS)遍历其依赖的所有服务,标记为故障,并将它们加入栈中,直到没有更多服务受影响。
筛选可用服务:
遍历所有服务,排除已标记为故障的服务,剩余的服务即为仍然可用的服务。
按输入顺序输出:
对可用服务按照 appearanceOrder 的顺序排序,并用逗号拼接输出。如果没有可用服务,直接输出 ,。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
vector<string> split(const string& s, char delimiter) {
vector<string> tokens;
string token;
istringstream tokenStream(s);
while (getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
string determineActiveServices(const vector<pair<string, string>>& relations, const vector<string>& failures) {
map<string, set<string>> dependencyMap;
set<string> failureSet(failures.begin(), failures.end());
map<string, int> appearanceOrder;
int index = 0;
for (const auto& relation : relations) {
const string& dependent = relation.first;
const string& provider = relation.second;
dependencyMap[provider].insert(dependent);
if (appearanceOrder.find(dependent) == appearanceOrder.end()) {
appearanceOrder[dependent] = index++;
}
if (appearanceOrder.find(provider) == appearanceOrder.end()) {
appearanceOrder[provider] = index++;
}
}
for (const auto& failure : failures) {
stack<string> stack;
stack.push(failure);
while (!stack.empty()) {
string service = stack.top();
stack.pop();
if (dependencyMap.find(service) != dependencyMap.end()) {
for (const auto& dependent : dependencyMap[service]) {
if (failureSet.find(dependent) == failureSet.end()) {
failureSet.insert(dependent);
stack.push(dependent);
}
}
dependencyMap.erase(service);
}
}
}
vector<string> operationalList;
for (const auto& entry : appearanceOrder) {
if (failureSet.find(entry.first) == failureSet.end()) {
operationalList.push_back(entry.first);
}
}
if (operationalList.empty()) {
return ",";
}
sort(operationalList.begin(), operationalList.end(), [&](const string& a, const string& b) {
return appearanceOrder[a] < appearanceOrder[b];
});
string result = operationalList[0];
for (size_t i = 1; i < operationalList.size(); ++i) {
result += "," + operationalList[i];
}
return result;
}
int main() {
string relationsInput;
getline(cin, relationsInput);
vector<string> relationsPairs = split(relationsInput, ',');
vector<pair<string, string>> relations;
for (const auto& pairStr : relationsPairs) {
vector<string> pair = split(pairStr, '-');
relations.emplace_back(pair[0], pair[1]);
}
string failuresInput;
getline(cin, failuresInput);
vector<string> failures = split(failuresInput, ',');
cout << determineActiveServices(relations, failures) << endl;
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
第一行输入表示依赖关系,格式如 A-B,B-C,解析为二维数组 rel,其中每个元素是 [依赖服务, 被依赖服务]。
第二行输入表示故障服务,格式如 A,C,解析为数组 brk。
构建依赖关系图和服务顺序:
使用 nxt 构建依赖关系图:
键是被依赖的服务,值是依赖它的服务集合。
使用 fst 记录每个服务的输入顺序,用于最终结果的排序。
故障传播:
遍历故障服务列表 brk,从每个故障服务开始,递归删除所有依赖它的服务,并从依赖关系图中移除。
筛选可用服务:
剩余在依赖关系图 nxt 中的服务即为未受影响的服务。
按 fst 中的顺序对这些服务进行排序。
返回结果:
如果没有可用服务,返回 ,。
否则,返回按顺序排序后,用逗号拼接的可用服务列表。
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const ln = [];
rl.on("line", (line) => {
ln.push(line);
if (ln.length === 2) {
const rel = ln[0].split(",").map((p) => p.split("-"));
const brk = ln[1].split(",");
console.log(getNorm(rel, brk));
ln.length = 0;
}
});
function getNorm(rel, brk) {
const nxt = {};
const fst = {};
let idx = 0;
for (let [c, f] of rel) {
if (!nxt[c]) nxt[c] = new Set();
if (!nxt[f]) nxt[f] = new Set();
nxt[f].add(c);
if (!fst[c]) fst[c] = idx++;
if (!fst[f]) fst[f] = idx++;
}
for (let s of brk) {
del(nxt, s);
}
const res = Object.keys(nxt);
if (res.length == 0) return ",";
return res.sort((a, b) => fst[a] - fst[b]).join(",");
}
function del(nxt, s) {
if (nxt[s]) {
const rm = nxt[s];
delete nxt[s];
for (let ss of rm) {
del(nxt, ss);
}
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: