90分求助
  • 板块P1186 玛丽卡
  • 楼主Mumu_3
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/23 15:55
  • 上次更新2023/10/24 00:02:30
查看原帖
90分求助
586329
Mumu_3楼主2023/2/23 15:55

rt,最后四个点TLE

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1005;
int n, m, g[N][N], dis[N], minn, k, ans, x, y;
bool vis[N], flag;
int pre[N];
int min(int a, int b) {
	return a < b ? a : b;
}
void dijkstra()
{
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, false, sizeof(vis));
	dis[1] = 0;
	for (int i = 1; i < n; i++)
	{
		minn = dis[0];
		for (int j = 1; j <= n; j++)
		{
			if (!vis[j] && dis[j] < minn)
			{
				minn = dis[j];
				k = j;
			}
		}
		vis[k] = true;
		for (int j = 1; j <= n; j++)
		{
			if (flag && ((k == x && j == y) || (k == y && j == x)))
				continue;
			if (!vis[j] && dis[k] + g[k][j] < dis[j])
			{
				dis[j] = dis[k] + g[k][j];
				if (!flag)
					pre[j] = k;
			}
		}
	}
	ans = max(ans, dis[n]);
}
signed main()
{
	memset(g, 0x3f, sizeof(g));
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int a, b, v;
		cin >> a >> b >> v;
		g[a][b] = g[b][a] = min(g[a][b], v);
	}
	dijkstra();
	flag = true;
	for (int i = n; i; i = pre[i])
	{
		x = i;
		y = pre[i];
		dijkstra();
	}
	cout << ans << endl;
	return 0;
}
2023/2/23 15:55
加载中...