站外题求条,玄关
  • 板块灌水区
  • 楼主_ScreamBrother_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/25 21:57
  • 上次更新2024/8/26 09:36:32
查看原帖
站外题求条,玄关
1047636
_ScreamBrother_楼主2024/8/25 21:57

给出一张包含 nn 个节点、 mm 条边的无向图,现在你可以任意取仅一条边,将它的边权变为原来的 1/21/2,请你求出此时图上两点 s,ts,t 间可能的最短路径长度。

其中 1≤n≤500,1≤m≤50000,1≤边权≤5000001 \le n \le 500, 1 \le m \le 50000, 1 \le 边权 \le 500000 ,保证所有边权为偶数。

我的代码:

#include <bits/stdc++.h>
using namespace std;

int N, M, S, T, u, v, d[514], G[1919][810], w;
bool vis[1919] = {};

void Dijkstra() {
	vis[S] = true;
	for (int i = 1; i <= N; i ++) d[i] = 1145140000;
	d[S] = 0;
	for (int i = 1; i < N; i ++) {
		int n = 0, m = 1145140000;
		for (int j = 1; j <= N; j ++)
			if (!vis[j] && d[j] < m) n = j, m = d[j];
		
		vis[n] = true;
		
		for (int j = 1; j <= N; j ++)
			if (!vis[j] && m + G[n][j] < d[j])
				d[j] = m + G[n][j];
	}
}

int main() {
	ios::sync_with_stdio(false), cin.tie(), cout.tie();
	
	int mu, mv, mw = -114514;
	cin >> N >> M;
	for (int i = 1; i <= M; i ++) {
		cin >> u >> v >> w;
		G[u][v] = w;
		if (mw < w) mu = u, mv = v, mw = w;
	}
	G[mu][mv] /= 2, G[mv][mu] /= 2;
	cin >> S >> T;
	
	Dijkstra();
	cout << d[T];
	
	return 0;
}
2024/8/25 21:57
加载中...