168862025-05-15 13:45:13algoproVázsony vonatjegyet vásárolcpp17Accepted 100/100688ms58320 KiB
// UUID: 2907c23f-c678-4ee8-8e59-670c72cdc5fe
#include <bits/stdc++.h>
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,ll>> g[maxn];
vector<int> g1[maxn];
ll 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 (d[to]>d[v]) continue;
        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<ll,int>> q;
    q.push({0, b});
    vector<pair<ll,int>> srt = {{0,b}};
    fill(d, d+maxn, -1);
    d[b]=0;

    while (!q.empty()){
        auto [dist, v] = q.top();
        q.pop();
        srt.push_back({d[v], v});
        if (d[v]< -dist) continue;
        for (auto [to,c] : g[v]){
            if (d[to]==-1 || d[v]+c<d[to]){
                d[to]=d[v]+c;
                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];
            p[i]=p[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
1Accepted6ms6196 KiB
2Accepted123ms17448 KiB
subtask220/20
3Accepted57ms11632 KiB
4Accepted379ms38200 KiB
5Accepted284ms29736 KiB
6Accepted301ms28556 KiB
7Accepted342ms30284 KiB
8Accepted252ms26500 KiB
9Accepted623ms47932 KiB
subtask315/15
10Accepted158ms24884 KiB
11Accepted13ms7036 KiB
12Accepted14ms7476 KiB
13Accepted35ms10488 KiB
14Accepted68ms16692 KiB
subtask420/20
15Accepted71ms13224 KiB
16Accepted287ms23204 KiB
17Accepted43ms12456 KiB
18Accepted93ms18852 KiB
19Accepted46ms11696 KiB
20Accepted83ms15404 KiB
subtask545/45
21Accepted7ms6196 KiB
22Accepted688ms58320 KiB
23Accepted48ms10804 KiB
24Accepted237ms24424 KiB
25Accepted204ms20896 KiB
26Accepted316ms30752 KiB
27Accepted210ms23112 KiB
28Accepted611ms46652 KiB
29Accepted120ms17448 KiB
30Accepted460ms40224 KiB
31Accepted289ms23844 KiB
32Accepted41ms11060 KiB
33Accepted344ms29824 KiB
34Accepted351ms31760 KiB
35Accepted360ms29564 KiB
36Accepted298ms27148 KiB
37Accepted293ms26384 KiB