30pts求助悬关
查看原帖
30pts求助悬关
381926
_Anonymous_楼主2023/8/24 10:23

思路是再存一个沿途点权最大值,跑Floyd,没想到会有什么情况不对

#include<bits/stdc++.h>
#define debug cout << "OK" << endl;
#define MAXN int(2e2 + 70)
#define MAXM int(1e4 + 10)
using namespace std;

int dis[MAXN][MAXN], pt[MAXN][MAXN];
int n, m, q;

int main()
{
	memset(dis, -1, sizeof(dis));
	memset(pt, -1, sizeof(pt));
	cin >> n >> m >> q;
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &pt[i][i]);
		dis[i][i] = 0;
	}
	for(int i = 1; i <= m; i++)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		if(dis[u][v] > w || dis[u][v] == -1)
		{
			dis[u][v] = dis[v][u] = w;
		}
		pt[u][v] = pt[v][u] = max(pt[u][u], pt[v][v]);
	}
	for(int k = 1; k <= n; k++)
	{
		for(int i = 1; i <= n; i++)
		{
			if(dis[i][k] == -1)
			{
				continue;
			}
			for(int j = 1; j <= n; j++)
			{
				if(dis[k][j] == -1)
				{
					continue;
				}
				if(max(pt[i][k], pt[k][j]) + dis[i][k] + dis[k][j] < pt[i][j] + dis[i][j] || dis[i][j] == -1)
				{
					dis[i][j] = dis[i][k] + dis[k][j];
					pt[i][j] = max(pt[i][k], pt[k][j]);
				}
			}
		}
	}
	for(int i = 1; i <= q; i++)
	{
		int u, v;
		scanf("%d %d", &u, &v);
		printf("%d\n", dis[u][v] + pt[u][v]);
	}
 	return 0;
}
2023/8/24 10:23
加载中...