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>
using namespace std;
const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()
#define maxn 210
#define maxm 50010
int n, m, d[maxn][maxn], dx1[maxn][maxn], dxn[maxn][maxn];
pair<int,int> mn1[maxn], mnn[maxn];
int u[maxm], v[maxm], c[maxm], up[maxm];
vector<int> g[maxn];
void shpx1(int x) {
for(int i = 1; i <= n; i++) {
dx1[x][i] = inf;
}
if(x == 1) return;
priority_queue<pair<int,int>> pq; pq.push(mp(0,1)); dx1[x][1] = 0;
while(pq.size()) {
int a = pq.top().sc;
int dist = -pq.top().fr;
pq.pop();
if(dist != dx1[x][a]) continue;
for(auto i : g[a]) {
int b = v[i];
int w = c[i];
if(b == x) continue;
if(dx1[x][b] > dx1[x][a] + w) {
dx1[x][b] = dx1[x][a] + w;
pq.push(mp(-dx1[x][b],b));
}
}
}
}
void shpxn(int x) {
for(int i = 1; i <= n; i++) {
dxn[x][i] = inf;
}
if(x == n) return;
priority_queue<pair<int,int>> pq; pq.push(mp(0,n)); dxn[x][n] = 0;
while(pq.size()) {
int a = pq.top().sc;
int dist = -pq.top().fr;
pq.pop();
if(dist != dxn[x][a]) continue;
for(auto i : g[a]) {
int b = v[i];
int w = c[i];
if(b == x) continue;
if(dxn[x][b] > dxn[x][a] + w) {
dxn[x][b] = dxn[x][a] + w;
pq.push(mp(-dxn[x][b],b));
}
}
}
}
void solve() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
d[i][j] = inf;
}
d[i][i] = 0;
}
for(int i = 1; i <= m; i++) {
cin >> u[i] >> v[i] >> c[i] >> up[i];
g[u[i]].pb(i);
d[u[i]][v[i]] = min(d[u[i]][v[i]],c[i]);
}
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
// cout << i << " " << j << " " << d[i][j] << endl;
}
}
//tenho que pegar dx1 e dxn
for(int i = 1; i <= n; i++) {
shpx1(i);
shpxn(i);
}
//pegar o menor/segundo menor de cada cara
for(int a = 1; a <= n; a++) {
mn1[a] = mp(inf,inf);
if(a == n) mn1[a] = mp(0,inf);
for(auto i : g[a]) {
int b = v[i];
// cout << " " << a << " " << b << endl;
mn1[a].sc = min(mn1[a].sc, d[1][a] + c[i] + d[b][n]);
if(mn1[a].sc < mn1[a].fr) swap(mn1[a].fr,mn1[a].sc);
}
// cout << a << " " << mn1[a].fr << " " << mn1[a].sc << endl;
}
for(int a = 1; a <= n; a++) {
mnn[a] = mp(inf,inf);
if(a == 1) mnn[a] = mp(0,inf);
for(auto i : g[a]) {
int b = v[i];
mnn[a].sc = min(mnn[a].sc, d[n][a] + c[i] + d[b][1]);
if(mnn[a].sc < mnn[a].fr) swap(mnn[a].fr,mnn[a].sc);
}
}
int ans = inf;
ans = min(ans, d[1][n]+d[n][1]);
//usa no 1->n
for(int i = 1; i <= m; i++) {
int ans1 = 0;
if(d[n][1] == d[n][u[i]] + c[i] + d[v[i]][1]) {
ans1 = min(dxn[u[i]][1], mnn[u[i]].sc);
}
else {
ans1 = d[n][1];
}
ans1 = min(ans1,d[n][v[i]]+c[i]+d[u[i]][1]);
// ans1+= d[1][v[i]]+c[i]+up[i]+d[u[i]][n];
ans = min(ans,ans1);
}
//usa no n->1
for(int i = 1; i <= m; i++) {
int ans1 = 0;
if(d[1][n] == d[1][u[i]] + c[i] + d[v[i]][n]) {
ans1 = min(dx1[u[i]][n], mn1[u[i]].sc);
}
else {
ans1 = d[1][n];
}
ans1 = min(ans1,d[1][v[i]]+c[i]+d[u[i]][n]);
// ans1+= d[n][v[i]]+c[i]+up[i]+d[u[i]][1];
ans = min(ans,ans1);
}
if(ans == inf) cout << -1 << endl;
else cout << ans << endl;
}
int32_t main() {
ios::sync_with_stdio(false); cin.tie(0);
// freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
int tt = 1;
// cin >> tt;
while(tt--) solve();
}
# | 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... |