#include <iostream> #include <map> #include <vector> using namespace std; struct Graph { struct Edge { long distance; }; struct Vertex : map< int, int > { int color; int marker; long distance; Vertex() : color(0), marker(0), distance(0) { } }; vector< Vertex > V; vector< Edge > E; vector< int > Eunused; int marker; Graph(int n) : V(n), marker(0) { } int connect(int a, int b) { int eid; if (Eunused.size()) { eid = *Eunused.rbegin(); Eunused.pop_back(); } else E.resize((eid = E.size()) + 1); return V[b][a] = V[a][b] = eid; } void disconnect(int a, int b) { Vertex::iterator it = V[a].find(b); Eunused.push_back(it->second); V[a].erase(it); V[b].erase(a); } void color(int a, long d, int c) { vector< int > q(1, a); V[a].distance = 0; ++marker; for (int i = 0; i < (int)q.size(); ++i) { Vertex &u = V[q[i]]; u.marker = marker; u.color = c; if (u.distance >= d) continue; for (Vertex::const_iterator it = u.begin(); it != u.end(); ++it) { Vertex &v = V[it->first]; if (v.marker != marker) if ((v.distance = u.distance + E[it->second].distance) <= d) q.push_back(it->first); } } } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m, q, a, b, c; cin >> n >> m >> q; long d; Graph g(n); while (m-- && cin >> a >> b >> d) g.E[g.connect(--a, --b)].distance = d; while (q-- && cin >> n >> a) switch (n) { case 1: cin >> b >> d; g.E[g.connect(--a, --b)].distance = d; break; case 2: cin >> b; g.disconnect(--a, --b); break; case 3: cin >> d >> c; g.color(--a, d, c); break; default: cout << g.V[--a].color << '\n'; } }
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 | #include <iostream> #include <map> #include <vector> using namespace std; struct Graph { struct Edge { long distance; }; struct Vertex : map< int, int > { int color; int marker; long distance; Vertex() : color(0), marker(0), distance(0) { } }; vector< Vertex > V; vector< Edge > E; vector< int > Eunused; int marker; Graph(int n) : V(n), marker(0) { } int connect(int a, int b) { int eid; if (Eunused.size()) { eid = *Eunused.rbegin(); Eunused.pop_back(); } else E.resize((eid = E.size()) + 1); return V[b][a] = V[a][b] = eid; } void disconnect(int a, int b) { Vertex::iterator it = V[a].find(b); Eunused.push_back(it->second); V[a].erase(it); V[b].erase(a); } void color(int a, long d, int c) { vector< int > q(1, a); V[a].distance = 0; ++marker; for (int i = 0; i < (int)q.size(); ++i) { Vertex &u = V[q[i]]; u.marker = marker; u.color = c; if (u.distance >= d) continue; for (Vertex::const_iterator it = u.begin(); it != u.end(); ++it) { Vertex &v = V[it->first]; if (v.marker != marker) if ((v.distance = u.distance + E[it->second].distance) <= d) q.push_back(it->first); } } } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m, q, a, b, c; cin >> n >> m >> q; long d; Graph g(n); while (m-- && cin >> a >> b >> d) g.E[g.connect(--a, --b)].distance = d; while (q-- && cin >> n >> a) switch (n) { case 1: cin >> b >> d; g.E[g.connect(--a, --b)].distance = d; break; case 2: cin >> b; g.disconnect(--a, --b); break; case 3: cin >> d >> c; g.color(--a, d, c); break; default: cout << g.V[--a].color << '\n'; } } |