时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
难度:困难
描述
一个局域网内有很多台电脑,分别标注为1到N的数字。
相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。
其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长时间。
如果最后有电脑不会感染,则返回-1。
给定一个数组times表示一个电脑把相邻电脑感染所用的时间。
path[]= {i,j,t} 表示电脑i->j电脑i上的病毒感染j,需要时间t。
输入描述
第一行一个参数,表示局域网内电脑个数N。1<=N<=200
第二行一个参数,表示网络连接条数M
接下来M行,表示网络连接情况,格式为i j t
最后一行一个参数,表示病毒最开始所在的电脑编号
输出描述
一个数字,表示感染电脑所需要花费的所有时间。
用例输入 1 **
4
3
2 1 1
2 3 1
3 4 1
2
用例输出 1 **
2
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
int networkInfectionTime(int N, int M, vector<vector<int>>& connections, int start) {
// 构建图的邻接表
vector<vector<pair<int, int>>> graph(N + 1);
for (const auto& conn : connections) {
int i = conn[0], j = conn[1], t = conn[2];
graph[i].emplace_back(j, t);
}
// 初始化距离数组
vector<int> dist(N + 1, INT_MAX);
dist[start] = 0;
// 使用优先队列的Dijkstra算法
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;
heap.emplace(0, start);
while (!heap.empty()) {
int current_dist = heap.top().first;
int u = heap.top().second;
heap.pop();
if (current_dist > dist[u]) {
continue;
}
for (const auto& edge : graph[u]) {
int v = edge.first;
int t = edge.second;
if (dist[v] > dist[u] + t) {
dist[v] = dist[u] + t;
heap.emplace(dist[v], v);
}
}
}
int max_time = 0;
for (int i = 1; i <= N; ++i) {
if (dist[i] == INT_MAX) {
return -1;
}
if (dist[i] > max_time) {
max_time = dist[i];
}
}
return max_time;
}
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> connections(M, vector<int>(3));
for (int i = 0; i < M; ++i) {
cin >> connections[i][0] >> connections[i][1] >> connections[i][2];
}
int start;
cin >> start;
cout << networkInfectionTime(N, M, connections, start) << endl;
return 0;
}