本文共 2922 字,大约阅读时间需要 9 分钟。
为了解决这个问题,我们需要找到哈利波特从城市1到城市n的最短路径,并在考虑伏地魔破坏任意一条边的情况下,确保哈利波特仍能以最坏情况下的最短时间到达城市n。
d1中。d1[u] + w == d1[v]或d1[v] + w == d1[u],其中u和v是边的两个端点。#include#include #include #include using namespace std;struct Edge { int u, v, w; int id;};void add_edge(int u, int v, int w, int id, vector >& adj) { adj[u].push_back({v, w, id}); adj[v].push_back({u, w, id});}void dijkstra(int start, int n, int exclude_u, int exclude_v, int exclude_w, vector >& adj, vector & dist) { dist.assign(n + 1, INT_MAX); dist[start] = 0; priority_queue > pq; pq.push({0, start}); while (!pq.empty()) { int d, u = pq.top().second; pq.pop(); if (dist[u] < d) continue; for (const auto& edge : adj[u]) { int v = edge.first; int w = edge.second; int edge_id = edge.third; // 跳过被破坏的边 if (u == exclude_u && v == exclude_v && w == exclude_w) { continue; } if (v == u) continue; // 防止自环 if (dist[v] > d + w) { dist[v] = d + w; pq.push({dist[v], v}); } } }}int main() { int t; cin >> t; for (int _ = 0; _ < t; ++ _) { int n, m; cin >> n >> m; vector > adj(n + 1); vector all_edges; for (int i = 0; i < m; ++ i) { int u, v, w; cin >> u >> v >> w; all_edges.push_back({u, v, w}); add_edge(u, v, w, i, adj); } vector d1(n + 1, INT_MAX); d1[1] = 0; priority_queue > pq; pq.push({0, 1}); while (!pq.empty()) { int d, u = pq.top().second; pq.pop(); if (d1[u] < d) continue; for (const auto& edge : adj[u]) { int v = edge.first; int w = edge.second; if (d1[v] > d1[u] + w) { d1[v] = d1[u] + w; pq.push({d1[v], v}); } } } if (d1[n] == INT_MAX) { cout << "-1"; continue; } vector E_prime; for (int i = 0; i < m; ++ i) { const Edge& e = all_edges[i]; if (d1[e.u] + e.w == d1[e.v]) { E_prime.push_back(i); } } vector dist_n_list; for (int e_id : E_prime) { const Edge& e = all_edges[e_id]; vector dist(n + 1, INT_MAX); dist[1] = 0; priority_queue > pq; pq.push({0, 1}); while (!pq.empty()) { int d, u = pq.top().second; pq.pop(); if (dist[u] < d) continue; for (const auto& edge : adj[u]) { int v = edge.first; int w = edge.second; int edge_id = edge.third; if (u == e.u && v == e.v && w == e.w) { continue; } if (v == u) continue; if (dist[v] > d + w) { dist[v] = d + w; pq.push({dist[v], v}); } } } if (dist[n] != INT_MAX) { dist_n_list.push_back(dist[n]); } } if (dist_n_list.empty()) { cout << "-1"; } else { int max_time = *max_element(dist_n_list.begin(), dist_n_list.end()); cout << max_time; } } return 0;}
转载地址:http://hrewz.baihongyu.com/