WA 了一大堆求调
查看原帖
WA 了一大堆求调
649315
心灵震荡楼主2024/12/24 18:16

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;
}
2024/12/24 18:16
加载中...