如题,搞了一晚上这条个结果,真郁闷 测试点1本地能过,为啥提交上去过不去呢,太奇怪了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
#define ll long long
const ll INF = 0x3f3f3f3f3f3f;
int n, m, x[maxn], y[maxn];
ll c[maxn], d[maxn];
struct solve {
struct edge {
ll w;
int id;
} g[maxn][maxn];
ll dist[maxn];
int from[maxn], s;
bool vis[maxn], key[maxn];
solve () {
memset(g, -1, sizeof(g));
memset(from, 0, sizeof(from));
memset(key, false, sizeof(key));
}
void add(int u, int v, ll w, int id) {
g[u][v] = {w, id};
}
void dijstra() {
for (int i = 1; i <= n; ++i) {
dist[i] = INF;
vis[i] = false;
}
dist[s] = 0;
for (int i = 1; i <= n; ++i) {
int u = 0;
for (int j = 1; j <= n; ++j) {
if (!u && !vis[j]) {
u = j;
continue;
}
if (!vis[j] && dist[j] < dist[u] && dist[j] != INF) {
u = j;
}
}
vis[u] = true;
for (int v = 1; v <= n; ++v) {
ll w = g[u][v].w;
if (g[u][v].id == -1) {
continue;
}
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
from[v] = g[u][v].id;
}
}
}
for (int i = 1; i <= n; ++i) {
key[from[i]] = true;
}
}
} a[10];
void best_coder() {
cin >> n >> m;
a[1].s = 1;
a[2].s = n;
a[3].s = 1;
a[4].s = n;
a[5].s = 1;
a[6].s = n;
for (int i = 1; i <= m; ++i) {
cin >> x[i] >> y[i] >> c[i] >> d[i];
a[1].add(x[i], y[i], c[i], i);
a[2].add(x[i], y[i], c[i], i);
a[3].add(y[i], x[i], c[i], i);
a[4].add(y[i], x[i], c[i], i);
a[5].add(x[i], y[i], c[i], i);
a[6].add(x[i], y[i], c[i], i);
}
for (int i = 1; i <= 4; ++i) {
a[i].dijstra();
}
ll ans = a[1].dist[n] + a[2].dist[1];
for (int i = 1; i <= m; ++i) {
if (a[1].key[i] || a[2].key[i]) {
a[5].g[x[i]][y[i]] = {-1, -1};
a[6].g[x[i]][y[i]] = {-1, -1};
a[5].g[y[i]][x[i]] = {c[i], i};
a[6].g[y[i]][x[i]] = {c[i], i};
a[5].dijstra();
a[6].dijstra();
ans = min(ans, a[5].dist[n] + a[6].dist[1] + d[i]);
a[5].g[y[i]][x[i]] = {-1, -1};
a[6].g[y[i]][x[i]] = {-1, -1};
a[5].g[x[i]][y[i]] = {c[i], i};
a[6].g[x[i]][y[i]] = {c[i], i};
} else {
ll d1 = min(a[1].dist[n], a[1].dist[y[i]] + c[i] + a[4].dist[x[i]]);
ll d2 = min(a[2].dist[1], a[2].dist[x[i]] + c[i] + a[3].dist[y[i]]);
ans = min(ans, d[i] + d1 + d2);
}
}
if (ans >= INF) {
cout << -1 << "\n";
return;
}
cout << ans << "\n";;
}
void coder() {
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
best_coder();
return 0;
}