168862025-05-15 13:45:13algoproVázsony vonatjegyet vásárolcpp17Elfogadva 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();
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva6ms6196 KiB
2Elfogadva123ms17448 KiB
subtask220/20
3Elfogadva57ms11632 KiB
4Elfogadva379ms38200 KiB
5Elfogadva284ms29736 KiB
6Elfogadva301ms28556 KiB
7Elfogadva342ms30284 KiB
8Elfogadva252ms26500 KiB
9Elfogadva623ms47932 KiB
subtask315/15
10Elfogadva158ms24884 KiB
11Elfogadva13ms7036 KiB
12Elfogadva14ms7476 KiB
13Elfogadva35ms10488 KiB
14Elfogadva68ms16692 KiB
subtask420/20
15Elfogadva71ms13224 KiB
16Elfogadva287ms23204 KiB
17Elfogadva43ms12456 KiB
18Elfogadva93ms18852 KiB
19Elfogadva46ms11696 KiB
20Elfogadva83ms15404 KiB
subtask545/45
21Elfogadva7ms6196 KiB
22Elfogadva688ms58320 KiB
23Elfogadva48ms10804 KiB
24Elfogadva237ms24424 KiB
25Elfogadva204ms20896 KiB
26Elfogadva316ms30752 KiB
27Elfogadva210ms23112 KiB
28Elfogadva611ms46652 KiB
29Elfogadva120ms17448 KiB
30Elfogadva460ms40224 KiB
31Elfogadva289ms23844 KiB
32Elfogadva41ms11060 KiB
33Elfogadva344ms29824 KiB
34Elfogadva351ms31760 KiB
35Elfogadva360ms29564 KiB
36Elfogadva298ms27148 KiB
37Elfogadva293ms26384 KiB