#include <bits/stdc++.h>
// Author: Ilove._.Ghibli0369
#define fi first
#define se second
#define pii pair<int,int>
#define all(a) a.begin(), a.end()
#define int long long
using namespace std;
const int mn = 2e2 + 5;
const int mod = 1000000007LL, inf = 1e15;
int n, m, kc[mn][mn], imp[mn], d1[mn], dn[mn], par[mn];
struct Egde{
int u, v, c, w;
} e[500005];
vector <int> a[mn];
void dijkstra(int u, int d[]){
for(int i = 1; i <= n; i++){
d[i] = inf;
par[i] = 0;
}
d[u] = 0;
priority_queue <pii, vector <pii>, greater<pii>> pq;
pq.push({d[u], u});
while(pq.size()){
auto [c, u] = pq.top();
pq.pop();
if(c > d[u]) continue;
for(auto i : a[u]){
if(d[e[i].v] > d[u] + e[i].c){
d[e[i].v] = d[u] + e[i].c;
par[e[i].v] = i;
pq.push({d[e[i].v], e[i].v});
}
}
}
}
void solve(){
cin >> n >> m;
fill(&kc[0][0], &kc[0][0] + mn * mn, inf);
for(int i = 1; i <= n; i++) kc[i][i] = 0;
for(int i = 1; i <= m; i++){
int u, v, c, w; cin >> u >> v >> c >> w;
a[u].push_back(i);
e[i] = {u, v, c, w};
kc[u][v] = min(kc[u][v], c);
}
dijkstra(1, d1);
int cur = n;
while(cur && par[cur]){
imp[par[cur]] = 1;
cur = e[par[cur]].u;
}
dijkstra(n, dn);
cur = 1;
while(cur && par[cur]){
imp[par[cur]] = 1;
cur = e[par[cur]].u;
}
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
kc[i][j] = min(kc[i][j], kc[i][k] + kc[k][j]);
}
}
}
int res = d1[n] + dn[1];
for(int i = 1; i <= m; i++){
auto [u, v, c, w] = e[i];
if(!imp[i]){
res = min(res, min(kc[1][n], kc[1][v] + c + kc[u][n])
+ min(kc[n][1], kc[n][v] + c + kc[u][1]) + w);
}
else{
a[u].erase(find(all(a[u]), i));
swap(e[i].u, e[i].v);
a[v].push_back(i);
dijkstra(1, d1); dijkstra(n, dn);
res = min(d1[n] + dn[1] + w, res);
a[v].erase(find(all(a[v]), i));
swap(e[i].u, e[i].v);
a[u].push_back(i);
}
}
if(res > inf) res = -1;
cout << res << '\n';
}
// Waifu of the day: Persia Juliet
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
if(fopen("multship.inp", "r")){
freopen("multship.inp", "r", stdin);
freopen("multship.out", "w", stdout);
}
int t = 1;
// cin >> t;
while(t--) solve();
}
Compilation message (stderr)
ho_t4.cpp: In function 'int main()':
ho_t4.cpp:108:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
108 | freopen("multship.inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ho_t4.cpp:109:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
109 | freopen("multship.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |