제출 #535754

#제출 시각아이디문제언어결과실행 시간메모리
535754sam571128Robot (JOI21_ho_t4)C++17
0 / 100
135 ms21800 KiB
#include <bits/stdc++.h>

#define int long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 1e5+5, M = 2e5 + 5;
struct edge {
    int v, c, p;
};

int dis[N], cnt[M];
vector<edge> adj[N];

signed main() {
    fastio
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int u, v, c, p;
        cin >> u >> v >> c >> p;
        adj[u].push_back({v, c, p});
        adj[v].push_back({u, c, p});

    }

    fill(dis,dis+N,1e18);

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    dis[1] = 0;
    pq.push({0, 1});
    //dis, vertex, lst

    while (!pq.empty()) {
        auto [ww, u] = pq.top();
        pq.pop();

        if (ww > dis[u])
            continue;

        for (auto [v, c, p] : adj[u]) {
            cnt[c]++;
        }

        for (auto [v, c, p] : adj[u]) {
            if (dis[v] > dis[u] + (cnt[c] == 1 ? 0 : 1)) {
                dis[v] = dis[u] + (cnt[c] == 1 ? 0 : 1);
                pq.push({dis[v], v});
            }
        }

        for (auto [v, c, p] : adj[u]) {
            cnt[c]--;
        }
    }

    int ans = 1e18;

    ans = min(ans,dis[n]);
    cout << (ans == 1e18 ? -1 : ans) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...