Untitled

 avatar
unknown
c_cpp
10 months ago
2.4 kB
3
Indexable
// #define Many_SubTask
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(a) begin(a), end(a)
#define pb push_back
#define pii pair<int, int>
#define F first
#define S second
#define mp make_pair
const int mod = 998244353;
const int inf = 1e18;
const int MAXN = 100005;

int n, m;
vector<pii> Map[MAXN];
int dis[MAXN][2], length[MAXN][2];

struct node {
    int idx, cp;
};

deque<node> pq;
bool inq[MAXN][2];

void push(node a){
    if(inq[a.idx][a.cp]) return;
    inq[a.idx][a.cp] = true;
    if(!pq.empty() && dis[a.idx][a.cp] < dis[pq.front().idx][pq.front().cp]) pq.push_front(a);
    else if(!pq.empty() && dis[a.idx][a.cp] == dis[pq.front().idx][pq.front().cp] && length[a.idx][a.cp] > length[pq.front().idx][pq.front().cp]) pq.push_front(a);
    else pq.push_back(a);
}

void Dijkstra(int s, int e) {
    for (int i = 1; i <= n; i++) dis[i][0] = dis[i][1] = 1e9;
    
    dis[s][0] = 0;
    push({s, 0});

    while (!pq.empty()) {
        auto [src, cp] = pq.front(); pq.pop_front(); inq[src][cp] = false;


        for (auto [des, val] : Map[src]) {
            // use coupon
            if(!cp){
                if (dis[src][0] + 0 < dis[des][1]) {
                    dis[des][1] = dis[src][0];
                    length[des][1] = length[src][0] + 1;
                    push({des, 1});
                } else if (dis[src][0] + 0 == dis[des][1] && length[src][0] + 1 > length[des][1]) {
                    length[des][1] = length[src][0] + 1;
                    push({des, 1});
                }
            }

            // without coupon
            if (dis[src][cp] + val < dis[des][cp]) {
                dis[des][cp] = dis[src][cp] + val;
                length[des][cp] = length[src][cp] + 1;
                push({des, cp});
            } else if (dis[src][cp] + val == dis[des][cp] && length[src][cp] + 1 > length[des][cp]) {
                length[des][cp] = length[src][cp] + 1;
                push({des, cp});
            }
        }
    }
}

// 8 2 3 9
// 6 2 4 9

void solve() {
    cin >> n >> m;
    while (m--) {
        int u, v, w;
        cin >> u >> v >> w;
        Map[u].pb({v, w});
        Map[v].pb({u, w});
    }
    Dijkstra(1, n);
    cout << dis[n][1] << ' ' << length[n][1] - 1 << '\n';
}

signed main() {
    cin.sync_with_stdio(0), cin.tie(0);
    int N = 1;
#ifdef Many_SubTask
    cin >> N;
#endif
    for (int i = 1; i <= N; i++) {
        solve();
    }
}
Editor is loading...
Leave a Comment