Submission #379798

#TimeUsernameProblemLanguageResultExecution timeMemory
379798TeaTimeRobot (JOI21_ho_t4)C++17
34 / 100
3075 ms113236 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <ctime>
#include <queue>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
#define fastInp cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
 
const ll  MOD = 1e9 + 7, MX2 = 1e6, SZ = 1e6 + 100, INF = 1e9 * 1e9 + 100;
 
ll n, m;
 
struct edge {
    ll to, c, p, ind;
};
 
vector<vector<edge>> gr;
set<tuple<ll, ll, ll>> dists; // dist, v, col
map<pair<ll, ll>, ll> sv;
map<pair<ll, ll>, ll> cnt;
vector<map<ll, vector<ll>>> cols;
 
signed main() {
    fastInp;
 
    cin >> n >> m;
 
    gr.resize(n);
    cols.resize(n);
    dists.insert({ 0, 0, 0 });
    for (int i = 1; i < n; i++) dists.insert({ INF, i, 0 });
    for (int i = 0; i < m; i++) {
        ll u, v, c, p;
        cin >> u >> v >> c >> p;
        u--; v--;
        gr[u].push_back({ v, c, p, gr[v].size() });
        gr[v].push_back({ u, c, p, gr[u].size() - 1 });
        cols[u][c].push_back(gr[u].size() - 1);
        cols[v][c].push_back(gr[v].size() - 1);
        dists.insert({ INF, u, c });
        dists.insert({ INF, v, c });
        cnt[{v, c}] += p;
        cnt[{u, c}] += p;
    }
 
    for (auto c : dists) sv[{get<1>(c), get<2>(c)}] = get<0>(c);
     
    ll ds = INF;
    while (!dists.empty()) {
        tuple<ll, ll, ll> cur = (*dists.begin());
        dists.erase(dists.begin());
        ll d = get<0>(cur);
        ll v = get<1>(cur);
        ll c = get<2>(cur);
        if (v == n - 1 && c == 0) {
            ds = d;
            break;
        }
 
        if (c == 0) {
            for (auto e : gr[v]) {
                if (sv[{e.to, 0}] > d + e.p) {
                    dists.erase({ sv[{e.to, 0}], e.to, 0 });
                    sv[{e.to, 0}] = d + e.p;
                    dists.insert({ sv[{e.to, 0}], e.to, 0 });
                }
 
                if (sv[{e.to, 0}] > d + cnt[{v, e.c}] - e.p) {
                    dists.erase({ sv[{e.to, 0}], e.to, 0 });
                    sv[{e.to, 0}] = d + cnt[{v, e.c}] - e.p;
                    dists.insert({ sv[{e.to, 0}], e.to, 0 });
                }
            }
 
            for (auto e : gr[v]) {
                if (sv[{e.to, e.c}] > d) {
                    dists.erase({ sv[{e.to, e.c}], e.to, e.c });
                    sv[{e.to, e.c}] = d;
                    dists.insert({ sv[{e.to, e.c}], e.to, e.c });
                }
            }
        }
        else {
            for (auto ind : cols[v][c]) {
                edge e = gr[v][ind];
 
                if (sv[{e.to, 0}] > d + cnt[{v, e.c}] - e.p) {
                    dists.erase({ sv[{e.to, 0}], e.to, 0 });
                    sv[{e.to, 0}] = d + cnt[{v, e.c}] - e.p;
                    dists.insert({ sv[{e.to, 0}], e.to, 0 });
                }
            }
        }
    }
 
    ll a = ds;
 
    if (a == INF) {
        cout << "-1";
    }
    else {
        cout << a;
    }
 
    return 0;
}
 
/*
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
 
5 2
1 4 1 2
3 5 1 4
 
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
 
13 21
7 10 4 4
3 6 4 7
8 10 4 5
3 9 2 5
1 4 4 5
2 6 4 2
3 11 2 2
3 8 16 2
8 11 16 1
6 10 4 14
6 8 16 6
9 12 16 5
5 13 4 6
1 12 4 7
2 4 4 18
2 9 4 10
2 12 4 6
10 13 4 28
5 7 2 5
5 11 2 16
7 13 4 20
*/

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:45:46: warning: narrowing conversion of '(& gr.std::vector<std::vector<edge> >::operator[](((std::vector<std::vector<edge> >::size_type)v)))->std::vector<edge>::size()' from 'std::vector<edge>::size_type' {aka 'long unsigned int'} to 'll' {aka 'long long int'} [-Wnarrowing]
   45 |         gr[u].push_back({ v, c, p, gr[v].size() });
      |                                    ~~~~~~~~~~^~
Main.cpp:46:49: warning: narrowing conversion of '((& gr.std::vector<std::vector<edge> >::operator[](((std::vector<std::vector<edge> >::size_type)u)))->std::vector<edge>::size() - 1)' from 'std::vector<edge>::size_type' {aka 'long unsigned int'} to 'll' {aka 'long long int'} [-Wnarrowing]
   46 |         gr[v].push_back({ u, c, p, gr[u].size() - 1 });
      |                                    ~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...