社区讨论

90分求助

P1186玛丽卡参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo3368ew
此快照首次捕获于
2023/10/24 00:02
2 年前
此快照最后确认于
2023/10/24 00:02
2 年前
查看原帖
rt,最后四个点TLE
C
#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;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...