// clang-format off #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r) for(auto i=(l);i<=(r);++i) #define REP(i,n) FOR(i,0,(n)-1) #define ssize(x) int(x.size()) template<class A,class B>auto&operator<<(ostream&o,pair<A,B>p){return o<<"("<<p.first<<", "<<p.second<<")";} template<class T>auto operator<<(ostream&o,T x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<"}";} #ifdef DEBUG #define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n' #else #define debug(...) {} #endif // clang-format on // Global variables int nverts, nedges, nqueries; vector<vector<pair<int, LL>>> adj; vector<int> colours; vector<LL> dist; vector<pair<int, int>> dq; void input(); inline void adj_erase(vector<pair<int, LL>>& vec, int v); int main() { cin.tie(0)->sync_with_stdio(0); input(); while (nqueries--) { int type; cin >> type; switch (type) { case 1: { int a, b; LL w; cin >> a >> b >> w; adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); break; } case 2: { int a, b; cin >> a >> b; adj_erase(adj[a], b); adj_erase(adj[b], a); break; } case 3: { int start, c; LL max_dist; cin >> start >> max_dist >> c; dq.emplace_back(start, 0); dist[start] = 0; while (!dq.empty()) { auto [v, p] = std::move(dq.back()); dq.pop_back(); colours[v] = c; for (const auto& neigh : adj[v]) { if (neigh.first == p) continue; dist[neigh.first] = dist[v] + neigh.second; if (dist[neigh.first] <= max_dist) dq.emplace_back(neigh.first, v); } } break; } case 4: { int v; cin >> v; cout << colours[v] << "\n"; } } } return 0; } void input() { cin >> nverts >> nedges >> nqueries; adj.resize(nverts + 1); colours.resize(nverts + 1); dist.resize(nverts + 1); REP (e, nedges) { int a, b; LL w; cin >> a >> b >> w; adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); } } void adj_erase(vector<pair<int, LL>>& vec, int v) { auto it = vec.begin(); while (it->first != v) ++it; if (it + 1 < vec.end()) swap(*it, vec.back()); vec.pop_back(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // clang-format off #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r) for(auto i=(l);i<=(r);++i) #define REP(i,n) FOR(i,0,(n)-1) #define ssize(x) int(x.size()) template<class A,class B>auto&operator<<(ostream&o,pair<A,B>p){return o<<"("<<p.first<<", "<<p.second<<")";} template<class T>auto operator<<(ostream&o,T x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<"}";} #ifdef DEBUG #define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n' #else #define debug(...) {} #endif // clang-format on // Global variables int nverts, nedges, nqueries; vector<vector<pair<int, LL>>> adj; vector<int> colours; vector<LL> dist; vector<pair<int, int>> dq; void input(); inline void adj_erase(vector<pair<int, LL>>& vec, int v); int main() { cin.tie(0)->sync_with_stdio(0); input(); while (nqueries--) { int type; cin >> type; switch (type) { case 1: { int a, b; LL w; cin >> a >> b >> w; adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); break; } case 2: { int a, b; cin >> a >> b; adj_erase(adj[a], b); adj_erase(adj[b], a); break; } case 3: { int start, c; LL max_dist; cin >> start >> max_dist >> c; dq.emplace_back(start, 0); dist[start] = 0; while (!dq.empty()) { auto [v, p] = std::move(dq.back()); dq.pop_back(); colours[v] = c; for (const auto& neigh : adj[v]) { if (neigh.first == p) continue; dist[neigh.first] = dist[v] + neigh.second; if (dist[neigh.first] <= max_dist) dq.emplace_back(neigh.first, v); } } break; } case 4: { int v; cin >> v; cout << colours[v] << "\n"; } } } return 0; } void input() { cin >> nverts >> nedges >> nqueries; adj.resize(nverts + 1); colours.resize(nverts + 1); dist.resize(nverts + 1); REP (e, nedges) { int a, b; LL w; cin >> a >> b >> w; adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); } } void adj_erase(vector<pair<int, LL>>& vec, int v) { auto it = vec.begin(); while (it->first != v) ++it; if (it + 1 < vec.end()) swap(*it, vec.back()); vec.pop_back(); } |