Submission #1215450

#TimeUsernameProblemLanguageResultExecution timeMemory
1215450Mike_VuRobot (JOI21_ho_t4)C++17
0 / 100
94 ms20984 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double dou; #define pii pair<int, int> #define fi first #define se second #define pb push_back #define BITJ(x, j) (((x)>>(j))&1) #define MASK(j) (1LL<<(j)) #define ALL(v) v.begin(), v.end() template<typename T> bool maximize(T &x, const T &y) { if (x < y) {x = y; return 1;} return 0; } template<typename T> bool minimize(T &x, const T &y) { if (x > y) {x = y; return 1;} return 0; } struct edge{ int v, p, c; edge(int _v, int _p, int _c) { v = _v; p = _p; c = _c; } void takeval(int &_v, int &_p, int &_c) { _v = v; _p = p; _c = c; } }; bool cmpedge(const edge &a, const edge &b) { if (a.c != b.c) return a.c < b.c; return a.p < b.p; } const int maxn = 1e5+5; const ll INF = (ll)3e18+7; int n, m; vector<edge> rawadj[maxn]; vector<pair<int, ll>> adj[maxn]; ll dis[maxn]; void fixedge(int u) { sort(ALL(rawadj[u]), cmpedge); ll sumw = 0; for (int i = 0; i < (int)rawadj[u].size(); i++) { int v, p, c; ll w; rawadj[u][i].takeval(v, p, c); //independent -> 0 //dependent: itself or all others //new if (i == 0 || c != rawadj[u][i-1].c) { sumw = 0; } //check same if ((i > 0 && c == rawadj[u][i-1].c) || (i < (int)rawadj[u].size()-1 && c == rawadj[u][i+1].c)){ w = p; //if largest if (i == (int)rawadj[u].size()-1 || c != rawadj[u][i+1].c) { minimize(w, sumw); } sumw += p; } else { w = 0; } adj[u].pb({v, w}); // cout << u << ' ' << v << ' ' << w << "\n"; } } void dijkstra() { memset(dis, 0x3f, sizeof(dis)); priority_queue<pair<ll, int>> q; q.push({0, 1}); dis[1] = 0; while (!q.empty()) { int u = q.top().se; ll w = -q.top().fi; q.pop(); if (w != dis[u]) continue; for (pii cur : adj[u]) { int v = cur.fi; ll w = cur.se; if (minimize(dis[v], dis[u]+w)) { q.push({-dis[v], v}); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // #define name "task" // if (fopen(name".inp", "r")) { // freopen(name".inp", "r", stdin); // freopen(name".out", "w", stdout); // } cin >> n >> m; //input 1 bidi -> 2 unidi for (int i = 1; i <= m; i++) { int u, v, p, c; cin >> u >> v >> c >> p; rawadj[u].pb(edge(v, p, c)); rawadj[v].pb(edge(u, p, c)); } //consider each node for (int i = 1; i <= n; i++) { fixedge(i); } //dijkstra in final graph -> ans dijkstra(); cout << (dis[n] > INF ? -1 : dis[n]); } /* 5 7 2 3 7 1 1 4 5 1 4 5 3 1 3 4 7 1 2 4 3 1 3 5 6 1 1 2 5 1 5 2 1 4 1 2 3 5 1 4 4 6 1 4 4 4 3 4 1 3 1 3 4 4 2 4 3 1 2 3 3 2 1 2 4 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...