This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//éªè±é£é£å風å¯å¯
//天å°ä¸çè¼è«
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << " is " << x << endl;
#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
ll MAX(ll a){return a;}
ll MIN(ll a){return a;}
template<typename... Args>
ll MAX(ll a,Args... args){return max(a,MAX(args...));}
template<typename... Args>
ll MIN(ll a,Args... args){return min(a,MIN(args...));}
#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
int n,m;
vector<ii> al[300005];
ii edge[300005];
ll w[300005];
ll p[300005];
ll fw[300005]; //dist 1->i
ll bw[300005]; //dist N->i
priority_queue<ii,vector<ii>,greater<ii> > pq;
bool used[300005];
int TIME;
int in[300005];
int low[300005];
bool dc[300005]; //whether will disconnect vertice 1 and N
vector<int> bridge;
void dfs(int i,int p){
in[i]=low[i]=TIME++;
if (i==n) dc[i]=true;
for (auto &it:al[i]){
if (it.fi==p || !used[it.se]) continue;
if (!in[it.fi]){
dfs(it.fi,i);
low[i]=min(low[i],low[it.fi]);
if (dc[it.fi]){
if (in[it.fi]==low[it.fi]) bridge.push_back(it.se);
dc[i]=true;
}
}
else{
low[i]=min(low[i],in[it.fi]);
}
}
}
bool test(ll i){
if (i<fw[n]) return true;
rep(x,0,m){
used[x]=(fw[edge[x].fi]+w[x]+bw[edge[x].se]<=i ||
fw[edge[x].se]+w[x]+bw[edge[x].fi]<=i);
}
TIME=1;
bridge.clear();
memset(in,0,sizeof(in));
memset(dc,false,sizeof(dc));
dfs(1,-1);
for (auto &it:bridge){
if (fw[edge[it].fi]+w[it]+p[it]+bw[edge[it].se]>i &&
fw[edge[it].se]+w[it]+p[it]+bw[edge[it].fi]>i) return true;
}
return false;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
rep(x,0,m){
cin>>edge[x].fi>>edge[x].se>>w[x];
al[edge[x].fi].push_back(ii(edge[x].se,x));
al[edge[x].se].push_back(ii(edge[x].fi,x));
}
rep(x,m,0) p[x]=max(p[x+1],w[x+1]);
memset(fw,63,sizeof(fw));
fw[1]=0;
pq.push(ii(fw[1],1));
while (!pq.empty()){
ll node=pq.top().se,weight=pq.top().fi;
pq.pop();
if (fw[node]!=weight) continue;
for (auto &it:al[node]){
if (fw[it.fi]>weight+w[it.se]){
fw[it.fi]=weight+w[it.se];
if (it.fi!=n) pq.push(ii(fw[it.fi],it.fi));
}
}
}
memset(bw,63,sizeof(bw));
bw[n]=0;
pq.push(ii(bw[n],n));
while (!pq.empty()){
ll node=pq.top().se,weight=pq.top().fi;
pq.pop();
if (bw[node]!=weight) continue;
for (auto &it:al[node]){
if (bw[it.fi]>weight+w[it.se]){
bw[it.fi]=weight+w[it.se];
if (it.fi!=1) pq.push(ii(bw[it.fi],it.fi));
}
}
}
ll lo=fw[n]-1,hi=fw[n]+1e9+10,mi;
while (hi-lo>1){
mi=hi+lo>>1;
if (test(mi)) lo=mi;
else hi=mi;
}
cout<<hi<<endl;
}
Compilation message (stderr)
Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:295:8: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
295 | mi=hi+lo>>1;
| ~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |