제출 #476778

#제출 시각아이디문제언어결과실행 시간메모리
476778RainbowbunnyRobot (JOI21_ho_t4)C++17
24 / 100
3086 ms554044 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5 + 5;
const long long INF = 1e18;

struct ToEdge
{
    int v;
    long long p;
    ToEdge(int v = 0, long long p = 0) : v(v), p(p) {}
};

priority_queue <tuple <long long, int, int>, vector <tuple <long long, int, int> >, greater <tuple <long long, int, int> > > pq;

int n, m;
long long p[MAXN];
map <int, int> Sum[MAXN];
map <int, vector <ToEdge> > Adj[MAXN];
map <int, long long> Dist[MAXN];

void Add(long long dist, int node, int color)
{
    if(Dist[node][color] > dist)
    {
        Dist[node][color] = dist;
        pq.push(make_tuple(dist, node, color));
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int u, v, c;
        long long p;
        cin >> u >> v >> c >> p;
        Adj[u][c].emplace_back(v, p);
        Adj[v][c].emplace_back(u, p);
        Dist[u][c] = INF;
        Dist[v][c] = INF;
        Sum[u][c] += p;
        Sum[v][c] += p;
    }
    for(int i = 1; i <= n; i++)
    {
        Dist[i][0] = INF;
    }
    Add(0, 1, 0);
    while(pq.empty() == false)
    {
        int node, color;
        long long dist;
        tie(dist, node, color) = pq.top();
        pq.pop();
        if(dist == Dist[node][color])
        {
            if(color == 0)
            {
                for(auto x : Adj[node])
                {
                    for(auto y : x.second)
                    {
                        Add(dist, y.v, x.first);
                        Add(dist + min(y.p, Sum[node][x.first] - y.p), y.v, 0);
                    }
                }
            }
            else
            {
                for(auto x : Adj[node][color])
                {
                    Add(dist + Sum[node][color] - x.p, x.v, 0);
                }
            }
        }
    }
    if(Dist[n][0] == INF)
    {
        Dist[n][0] = -1;
    }
    cout << Dist[n][0] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...