168702025-05-14 20:54:26algoproVázsony vonatjegyet vásárolcpp17Hibás válasz 0/100718ms54864 KiB
// UUID: ceb5392a-23eb-4766-9750-f8ca141f40a1
#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,int>> g[maxn];
vector<int> g1[maxn];
int 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<int,int>> q;
    q.push({0, b});
    vector<pair<int,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();
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva7ms5688 KiB
2Hibás válasz109ms15720 KiB
subtask20/20
3Elfogadva56ms10864 KiB
4Hibás válasz374ms35856 KiB
5Hibás válasz314ms27944 KiB
6Hibás válasz314ms26784 KiB
7Hibás válasz275ms27856 KiB
8Hibás válasz248ms23992 KiB
9Hibás válasz623ms42912 KiB
subtask30/15
10Hibás válasz145ms20044 KiB
11Hibás válasz13ms6544 KiB
12Hibás válasz13ms6708 KiB
13Hibás válasz32ms9036 KiB
14Hibás válasz64ms13372 KiB
subtask40/20
15Hibás válasz61ms12168 KiB
16Elfogadva215ms20648 KiB
17Elfogadva41ms11668 KiB
18Hibás válasz105ms17832 KiB
19Hibás válasz48ms11048 KiB
20Hibás válasz81ms14120 KiB
subtask50/45
21Elfogadva6ms5940 KiB
22Hibás válasz718ms54864 KiB
23Hibás válasz45ms9840 KiB
24Hibás válasz178ms22256 KiB
25Hibás válasz166ms20928 KiB
26Hibás válasz319ms30288 KiB
27Hibás válasz163ms20520 KiB
28Hibás válasz456ms42816 KiB
29Hibás válasz105ms15664 KiB
30Hibás válasz460ms39584 KiB
31Elfogadva230ms22808 KiB
32Hibás válasz37ms9524 KiB
33Hibás válasz354ms27468 KiB
34Elfogadva275ms30124 KiB
35Elfogadva319ms27976 KiB
36Elfogadva272ms25924 KiB
37Elfogadva312ms25160 KiB