Submission #1254441

#TimeUsernameProblemLanguageResultExecution timeMemory
1254441hitsuujCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
266 ms21536 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define inf 1e18
#define ti tuple<int,int,int>
#define meekucaon ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int mod=1e9+7;
int sf(int a){return (a+mod)%mod;}
int kal(int a,int b){return (sf(a)*sf(b))%mod;}
int tam(int a,int b){return (sf(a)+sf(b))%mod;}
int kur(int a,int b){return (sf(a)+mod-sf(b))%mod;}
const int lim=100000;
vector<pii>g[lim+10];
vector<int>diss,dist,disv,disa,disb;
int n,m,s,t,a,b;
vector<int> cari(int aw){
    priority_queue<pii,vector<pii>,greater<pii>>q;
    vector<int>disc(n+10,inf);
    disc[aw]=0;
    q.push({0,aw});
    while(q.size()){
        auto [dis,u]=q.top();
        q.pop();
        if(disc[u]<dis) continue;
        for(auto [v,w]:g[u]){
            if(disc[v]<=dis+w) continue;
            disc[v]=dis+w;
            q.push({disc[v],v});
        }
    }
    return disc;
}
signed main(){
    meekucaon
    cin>>n>>m>>s>>t>>a>>b;
    for(int i=1;i<=m;i++){
        int u,v,w;cin>>u>>v>>w;
        g[u].pb({v,w});
        g[v].pb({u,w});
    }
    disa=cari(a);
    disb=cari(b);
    diss=cari(s);
    dist=cari(t);
    vector<int>mas(n+1,inf),kel(n+1,inf),vis(n+1);
    for(int i=1;i<=n;i++) mas[i]=disa[i];
    for(int i=1;i<=n;i++) kel[i]=disb[i];
    vector<int>maso(n+1,inf),kelo(n+1,inf);
    maso=mas,kelo=kel;
    int st=diss[t];
    queue<int>q;
    q.push(s);
    while(q.size()){
        int u=q.front();
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(auto [v,w]:g[u]){
            bool yes=0;
            if(diss[u]+w==diss[v] && dist[v]+w==dist[u] && diss[u]+w+dist[v]==st) yes=1;
            if(mas[u]+kel[u]<=mas[v]+kel[v] && yes){
                mas[v]=mas[u];
                mas[v]=min(mas[v],maso[v]);
                kel[v]=kel[u];
                kel[v]=min(kel[v],kelo[v]);
                // cout<<u<<' '<<v<<" "<<mas[v]<<" "<<kel[v]<<endl;
            }
            q.push(v);
        }
    }
    int ans=inf;
    for(int i=1;i<=n;i++){
        ans=min(ans,kel[i]+mas[i]);
        // cout<<i<<" "<<kel[i]<<" "<<mas[i]<<endl;
    }
    cout<<ans;

}

// cari shortest path dari s dan t 
// cari minimum fare dari a ke b 


// known stuff 
// 1. kita bisa cek edge ini masuk shortest route or not
// 2. dari semua yang kita ketahui -> minimum spanning tree dari u ke v?
// 3. harus tau shortest route mana yang dipakai untuk s ke t
// 4. mending pick route yang mana 
// 5. kalau satu arah tinggal cek dikurangin shortest route yang ada 

// subsoal 
// 1. kalau masuk dalam shortest path = weight 0 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...