제출 #1343677

#제출 시각아이디문제언어결과실행 시간메모리
1343677hoangtien69Robot (JOI21_ho_t4)C++20
100 / 100
912 ms81288 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int MAXX = 5e5 + 5;
const int INF = 1e18;

struct edge
{
    int u, v, c, w;
};


int n, m;
int id;
map<pii,int> mp;
vector<pii> adj[MAXX];
vector<edge> peal;
int sum[MAXX];
int d[MAXX];

int get(int a, int c)
{
    if (mp.find({a, c}) == mp.end())
    {
        mp[{a, c}] = ++id;
    }
    return mp[{a,c}];
}

void dijkstra()
{
    for (int i = 1; i <= n + 2 * m; i++)
    {
        d[i] = INF;
    }
    d[1] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({d[1], 1});
    while(!pq.empty())
    {
        auto [dist, u] = pq.top();
        pq.pop();
        if (dist > d[u])
        {
            continue;
        }
        for (auto[v, w] : adj[u])
        {
            if (d[v] > d[u] + w)
            {
                d[v] = d[u] + w;
                pq.push({d[v], v});
            }
        }
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    id = n;
    for (int i = 1; i <= m; i++)
    {
        int u, v, c, w;
        cin >> u >> v >> c >> w;
        peal.push_back({u, v, c, w});
        int curu = get(u, c);
        sum[curu] += w;
        int curv = get(v, c);
        sum[curv] += w;
    }
    for (auto[u, v, c, w] : peal)
    {
        for (int t = 0; t < 2; t++)
        {
            swap(u, v);
            int cur = get(u, c);
            adj[u].push_back({v, w});
            adj[u].push_back({cur, 0});
            int cur1 = get(v, c);
            adj[u].push_back({cur1, 0});
            adj[cur].push_back({v, sum[cur] - w});
        }
    }
    dijkstra();
    if (d[n] > 1e15)
    {
        cout << -1;
    }
    else
    {
        cout << d[n];
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...