제출 #1254445

#제출 시각아이디문제언어결과실행 시간메모리
1254445hitsuujCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
263 ms20896 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]) 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; } if(!vis[v])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...