for (int i = 1; i <= N; i++) { map<int, int> mp; for (int j = 1; j <= N; j++) // 寻找每个费用的最远距离 if (tu[i][j] != MAX && tu[i][j] > mp[2 + tu[i][j] / K]) mp[2 + tu[i][j] / K] = tu[i][j]; for (int j = 1; j <= N; j++) // 录入数据,构建邻接表 { if (tu[i][j] == mp[2 + tu[i][j] / K]) // 计费距离最远的站或线路末端站点出站 line[i].road.push_back(j); else if (i != j && line[j].end && tu[i][j] != MAX) line[i].road.push_back(j); } }换种写法
时间: 2024-03-08 22:50:06 浏览: 57
前K个高频单词(map+multimap)1
这段代码的功能是构建一个图的邻接表,其中每个节点的出边只连接到费用最远的站或者线路末端站点。以下是另一种可能的实现:
```
// 初始化邻接表为空
vector<vector<int>> adj(N+1);
// 寻找每个费用的最远距离
for (int i = 1; i <= N; i++) {
map<int, int> mp;
for (int j = 1; j <= N; j++) {
if (tu[i][j] != MAX && tu[i][j] > mp[2 + tu[i][j] / K]) {
mp[2 + tu[i][j] / K] = tu[i][j];
}
}
// 连接到费用最远的站或者线路末端站点
for (auto& [cost, length] : mp) {
for (int j = 1; j <= N; j++) {
if (tu[i][j] == length) {
adj[i].push_back(j);
}
}
for (int j : line[i].road) {
if (tu[i][j] == length) {
adj[i].push_back(j);
}
}
}
// 连接到线路起点
for (int j : line[i].road) {
if (line[j].start) {
adj[i].push_back(j);
}
}
}
```
这个实现将每个节点的出边连接到费用最远的站或者线路末端站点,同时也连接到线路起点。这个实现使用了 C++17 的结构化绑定和 range-based for 循环,代码更加简洁易读。
阅读全文