bluecode-2024E-电脑病毒感染

220 阅读2分钟

时间限制: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;
}