168702025-05-14 20:54:26algoproVázsony vonatjegyet vásárolcpp17Wrong answer 0/100718ms54864 KiB
// UUID: ceb5392a-23eb-4766-9750-f8ca141f40a1
#include <bits/stdc++.h>
#include <queue>
using namespace std;
using ll=long long;

#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define vi vector<int>
#define pii pair<int,int>

const int maxn=1e5+1;

vector<pair<int,int>> g[maxn];
vector<int> g1[maxn];
int d[maxn];
int n,m,a,b;
vector<int> val(maxn, -1);
vector<int> reach;

int group[maxn];
vector<vector<int>> groups;
int p[maxn];

void dfs(int v){
    reach.push_back(v);
    val[v]=0;
    for (int to : g1[v]){
        if (d[to]<d[v] && val[to]>val[v]){
            val[v]=val[to];
            p[v]=to;
        }
    }
    for (int to : g1[v]){
        if (val[to]!=-1) continue;
        dfs(to);
        if (val[to]>val[v]){
            val[v]=val[to];
            p[v]=p[to];
        }
    }
}

void solve(){
    cin>>n>>m>>a>>b;
    for (int i=0;i<m;i++){
        int u,v,c;
        cin>>u>>v>>c;
        g[u].push_back({v,c});
        g[v].push_back({u,c});
    }
    priority_queue<pair<int,int>> q;
    q.push({0, b});
    vector<pair<int,int>> srt = {{0,b}};
    fill(d, d+maxn, -1);
    d[b]=0;

    while (!q.empty()){
        auto [dist, v] = q.top();
        q.pop();
        if (d[v]< -dist) continue;
        for (auto [to,c] : g[v]){
            if (d[to]==-1){
                d[to]=d[v]+c;
                srt.push_back({d[to], to});
                q.push({-d[to], to});
            }
        }
    }
    sort(all(srt));
    for (int i=1;i<=n;i++){
        for (auto [to, c] : g[i]) if (d[i]>=d[to]) g1[i].push_back(to);
    }
    for (auto [_, v] : srt){
        if (val[v]!=-1) continue;
        reach.clear();
        dfs(v);
        val[v]+=reach.size();
        groups.push_back({});
        for (int i : reach){
            groups.back().push_back(i);
            group[i]=groups.size()-1;
            val[i] = val[v];
        }
    }
    cout<<val[a]<<"\n";
    int track=a;
    while(track!=b){
        for (int i : groups[group[track]]) cout<<i<<" ";
        track=p[track];
    }
    cout<<b;
}

int main() {
    ios_base::sync_with_stdio(0);cin.tie(0);
    int t=1;
    //cin>>t;
    while (t--){
        solve();
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted7ms5688 KiB
2Wrong answer109ms15720 KiB
subtask20/20
3Accepted56ms10864 KiB
4Wrong answer374ms35856 KiB
5Wrong answer314ms27944 KiB
6Wrong answer314ms26784 KiB
7Wrong answer275ms27856 KiB
8Wrong answer248ms23992 KiB
9Wrong answer623ms42912 KiB
subtask30/15
10Wrong answer145ms20044 KiB
11Wrong answer13ms6544 KiB
12Wrong answer13ms6708 KiB
13Wrong answer32ms9036 KiB
14Wrong answer64ms13372 KiB
subtask40/20
15Wrong answer61ms12168 KiB
16Accepted215ms20648 KiB
17Accepted41ms11668 KiB
18Wrong answer105ms17832 KiB
19Wrong answer48ms11048 KiB
20Wrong answer81ms14120 KiB
subtask50/45
21Accepted6ms5940 KiB
22Wrong answer718ms54864 KiB
23Wrong answer45ms9840 KiB
24Wrong answer178ms22256 KiB
25Wrong answer166ms20928 KiB
26Wrong answer319ms30288 KiB
27Wrong answer163ms20520 KiB
28Wrong answer456ms42816 KiB
29Wrong answer105ms15664 KiB
30Wrong answer460ms39584 KiB
31Accepted230ms22808 KiB
32Wrong answer37ms9524 KiB
33Wrong answer354ms27468 KiB
34Accepted275ms30124 KiB
35Accepted319ms27976 KiB
36Accepted272ms25924 KiB
37Accepted312ms25160 KiB