168712025-05-14 20:55:35algoproVázsony vonatjegyet vásárolcpp17Hibás válasz 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();
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva4ms6196 KiB
2Hibás válasz119ms16984 KiB
subtask20/20
3Elfogadva61ms11756 KiB
4Hibás válasz382ms38044 KiB
5Hibás válasz280ms29524 KiB
6Hibás válasz305ms28060 KiB
7Hibás válasz335ms29596 KiB
8Hibás válasz266ms25264 KiB
9Hibás válasz497ms45464 KiB
subtask30/15
10Hibás válasz150ms23604 KiB
11Hibás válasz14ms7404 KiB
12Hibás válasz14ms7412 KiB
13Hibás válasz37ms10288 KiB
14Hibás válasz68ms15924 KiB
subtask40/20
15Hibás válasz65ms13188 KiB
16Elfogadva289ms23120 KiB
17Elfogadva48ms12456 KiB
18Hibás válasz93ms18852 KiB
19Hibás válasz45ms11696 KiB
20Hibás válasz87ms15276 KiB
subtask50/45
21Elfogadva7ms6388 KiB
22Hibás válasz813ms57668 KiB
23Hibás válasz46ms10928 KiB
24Hibás válasz194ms24404 KiB
25Hibás válasz204ms22352 KiB
26Hibás válasz314ms32332 KiB
27Hibás válasz186ms22180 KiB
28Hibás válasz583ms46336 KiB
29Hibás válasz112ms16812 KiB
30Hibás válasz437ms41884 KiB
31Elfogadva250ms24904 KiB
32Hibás válasz41ms10804 KiB
33Hibás válasz328ms30588 KiB
34Elfogadva360ms31356 KiB
35Elfogadva300ms29368 KiB
36Elfogadva352ms27408 KiB
37Elfogadva300ms26644 KiB