rt,照着第一篇题解重构了前半部分代码之后还是错的。马蜂清晰(?)
#include <bits/stdc++.h>
using namespace std;
const int N = 305;
#define int long long
int f[N][N], g[N][N], n, m, u[N], v[N], c[N], d[N], dis[6][N], pre[6][N], ans = 2e16;
bool vis[6][N];
void Dijkstra(int o, int s)
{
for(int i = 0; i <= n; i++)
dis[o][i] = 2e16, vis[o][i] = 0, pre[o][i] = 0;
dis[o][s] = 0;
while(1)
{
int u = 0;
for(int i = 1; i <= n; i++)
if(!vis[o][i] && (u == 0 || dis[o][i] < dis[o][u])) u = i;
if(!u) break;
vis[o][u] = 1;
// cout << u << ' ';
for(int v = 1; v <= n; v++)
{
if(dis[o][v] > dis[o][u] + g[u][v])
dis[o][v] = dis[o][u] + g[u][v], pre[o][v] = u;
}
}
return;
}
signed main()
{
ios :: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
f[i][j] = g[i][j] = 2e16;
for(int i = 1; i <= m; i++)
{
cin >> u[i] >> v[i] >> c[i] >> d[i];
if(g[u[i]][v[i]] >= c[i]) f[u[i]][v[i]] = g[u[i]][v[i]], g[u[i]][v[i]] = c[i];
else f[u[i]][v[i]] = min(f[u[i]][v[i]], c[i]);
}
// g[i][j]: 最小值
// f[i][j]: 次小值
Dijkstra(0, 1); // cout << '\n';
Dijkstra(1, n); // cout << '\n';
// cout << dis[0][n];
// cout << dis[1][1];
ans = min(ans, dis[0][n] + dis[1][1]);
// cout << ans << '\n';
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
swap(g[i][j], g[j][i]);
Dijkstra(2, 1); // cout << '\n';
Dijkstra(3, n);// cout << '\n';
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
swap(g[i][j], g[j][i]);
for(int i = 1; i <= m; i++)
{
int w1 = g[u[i]][v[i]], w2 = g[v[i]][u[i]];
g[u[i]][v[i]] = f[u[i]][v[i]];
g[v[i]][u[i]] = min(g[v[i]][u[i]], c[i]);
int d1 = 0, d2 = 0;
if(pre[0][v[i]] != u[i] || dis[0][u[i]] + c[i] != dis[0][v[i]])
d1 = min(dis[0][n], dis[0][v[i]] + c[i] + dis[3][u[i]]);
else Dijkstra(4, 1), d1 = dis[4][n];
if(pre[1][v[i]] != u[i] || dis[1][u[i]] + c[i] != dis[1][v[i]])
d2 = min(dis[1][1], dis[1][v[i]] + c[i] + dis[2][u[i]]);
else Dijkstra(5, n), d2 = dis[5][1];
g[u[i]][v[i]] = w1, g[v[i]][u[i]] = w2;
ans = min(ans, d1 + d2 + d[i]);
}
cout << (ans >= 1e16 ? -1 : ans);
return 0;
}