168872025-05-15 13:45:39UVinceVázsony vonatjegyet vásárolcpp17Elfogadva 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();
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva6ms6196 KiB
2Elfogadva116ms17448 KiB
subtask220/20
3Elfogadva61ms11636 KiB
4Elfogadva441ms38196 KiB
5Elfogadva282ms29632 KiB
6Elfogadva263ms28488 KiB
7Elfogadva333ms30284 KiB
8Elfogadva244ms26492 KiB
9Elfogadva552ms47852 KiB
subtask315/15
10Elfogadva152ms24884 KiB
11Elfogadva13ms7220 KiB
12Elfogadva14ms7476 KiB
13Elfogadva37ms10564 KiB
14Elfogadva68ms16680 KiB
subtask420/20
15Elfogadva64ms13224 KiB
16Elfogadva243ms23204 KiB
17Elfogadva48ms12460 KiB
18Elfogadva112ms18852 KiB
19Elfogadva52ms11696 KiB
20Elfogadva92ms15272 KiB
subtask545/45
21Elfogadva6ms6196 KiB
22Elfogadva814ms58404 KiB
23Elfogadva50ms10808 KiB
24Elfogadva209ms24484 KiB
25Elfogadva182ms21036 KiB
26Elfogadva361ms30756 KiB
27Elfogadva188ms23116 KiB
28Elfogadva521ms46652 KiB
29Elfogadva123ms17448 KiB
30Elfogadva522ms40212 KiB
31Elfogadva245ms23844 KiB
32Elfogadva43ms11060 KiB
33Elfogadva342ms29844 KiB
34Elfogadva296ms31796 KiB
35Elfogadva368ms29460 KiB
36Elfogadva358ms27148 KiB
37Elfogadva358ms26268 KiB