168872025-05-15 13:45:39UVinceVázsony vonatjegyet vásárolcpp17Accepted 100/100814ms58404 KiB
#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
2Accepted116ms17448 KiB
subtask220/20
3Accepted61ms11636 KiB
4Accepted441ms38196 KiB
5Accepted282ms29632 KiB
6Accepted263ms28488 KiB
7Accepted333ms30284 KiB
8Accepted244ms26492 KiB
9Accepted552ms47852 KiB
subtask315/15
10Accepted152ms24884 KiB
11Accepted13ms7220 KiB
12Accepted14ms7476 KiB
13Accepted37ms10564 KiB
14Accepted68ms16680 KiB
subtask420/20
15Accepted64ms13224 KiB
16Accepted243ms23204 KiB
17Accepted48ms12460 KiB
18Accepted112ms18852 KiB
19Accepted52ms11696 KiB
20Accepted92ms15272 KiB
subtask545/45
21Accepted6ms6196 KiB
22Accepted814ms58404 KiB
23Accepted50ms10808 KiB
24Accepted209ms24484 KiB
25Accepted182ms21036 KiB
26Accepted361ms30756 KiB
27Accepted188ms23116 KiB
28Accepted521ms46652 KiB
29Accepted123ms17448 KiB
30Accepted522ms40212 KiB
31Accepted245ms23844 KiB
32Accepted43ms11060 KiB
33Accepted342ms29844 KiB
34Accepted296ms31796 KiB
35Accepted368ms29460 KiB
36Accepted358ms27148 KiB
37Accepted358ms26268 KiB