168712025-05-14 20:55:35algoproVázsony vonatjegyet vásárolcpp17Wrong answer 0/100813ms57668 KiB
// UUID: 6660d077-64c5-4fea-ab08-25ca1131e80f
#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,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 (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();
        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
1Accepted4ms6196 KiB
2Wrong answer119ms16984 KiB
subtask20/20
3Accepted61ms11756 KiB
4Wrong answer382ms38044 KiB
5Wrong answer280ms29524 KiB
6Wrong answer305ms28060 KiB
7Wrong answer335ms29596 KiB
8Wrong answer266ms25264 KiB
9Wrong answer497ms45464 KiB
subtask30/15
10Wrong answer150ms23604 KiB
11Wrong answer14ms7404 KiB
12Wrong answer14ms7412 KiB
13Wrong answer37ms10288 KiB
14Wrong answer68ms15924 KiB
subtask40/20
15Wrong answer65ms13188 KiB
16Accepted289ms23120 KiB
17Accepted48ms12456 KiB
18Wrong answer93ms18852 KiB
19Wrong answer45ms11696 KiB
20Wrong answer87ms15276 KiB
subtask50/45
21Accepted7ms6388 KiB
22Wrong answer813ms57668 KiB
23Wrong answer46ms10928 KiB
24Wrong answer194ms24404 KiB
25Wrong answer204ms22352 KiB
26Wrong answer314ms32332 KiB
27Wrong answer186ms22180 KiB
28Wrong answer583ms46336 KiB
29Wrong answer112ms16812 KiB
30Wrong answer437ms41884 KiB
31Accepted250ms24904 KiB
32Wrong answer41ms10804 KiB
33Wrong answer328ms30588 KiB
34Accepted360ms31356 KiB
35Accepted300ms29368 KiB
36Accepted352ms27408 KiB
37Accepted300ms26644 KiB