题目描述:
一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字,相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。
其中网络内一台电脑病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1。
给定一个数组 times 表示一台电脑把相邻电脑感染所用的时间。
如:path[i] = {i, j, t} 表示:电脑 i->j,电脑 i 上的病毒感染 j,需要
时间 t。
输入描述:
4
3
2 1 1
2 3 1
3 4 1
2
输入数据特别说明:
第1行,输入局域网内电脑个数N,1<=N<=200;
第2行,输出总共多少条网络连接M;
第3行到第3+M-1行,输入电脑连接情况以及病毒传染时间,如2 1 1,表示
病毒从电脑2传染到电脑1的时间为1
最后一行,输出病毒最开始所在电脑编号Num;
输出描述:
2
C++源码:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <climits>
using namespace std;
// 封装的核心函数
int findMaxDistance(int computerNums, int linkNums, int source) {
unordered_map<int, vector<pair<int, int>>> network;
for (int item = 0; item < linkNums; ++item) {
int i, j, k;
cin >> i >> j >> k;
network[i].push_back({ j, k });
// 如果需要无向图,可以在这里添加 network[j].push_back({i, k});
}
vector<int> target(computerNums + 1, INT_MAX);
target[source] = 0;
vector<int> compare{ source };
vector<bool> vd(computerNums + 1, false);
vd[source] = true;
while (!compare.empty()) {
int cur = compare.back();
compare.pop_back();
vd[cur] = false;
auto it = network.find(cur);
if (it != network.end()) {
for (const auto& edge : it->second) {
int i = edge.first, j = edge.second;
int count = target[cur] + j;
if (target[i] <= count) continue;
target[i] = count;
if (vd[i]) continue;
vd[i] = true;
compare.push_back(i);
}
}
}
return *max_element(target.begin() + 1, target.end());
}
int main() {
int computerNums, linkNums;
cin >> computerNums >> linkNums;
int source;
cin >> source;
int result = findMaxDistance(computerNums, linkNums, source);
if (result == INT_MAX) {
cout << -1 << endl;
}
else {
cout << result << endl;
}
system("pause");
return 0;
}