专栏文章

x

个人记录参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@minphznc
此快照首次捕获于
2025/12/02 06:14
3 个月前
此快照最后确认于
2025/12/02 06:14
3 个月前
查看原文
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m, t, c[85], dp[85][85], w[85][85][85], nxt[85][85];
vector <int> to[85];
// dp[i][j] 表示在第 i 天到达第 j 个城市的最小花费 

void init() {
	memset(dp, 0x3f, sizeof(dp));
	dp[0][1] = 0;
	memset(nxt, 0, sizeof(nxt));
	for (int i = 1; i <= n; i ++) to[i].clear();
	return ;
}
void solve() {
	cin >> n >> m >> t;
	init();
	for (int i = 1, x, y; i <= m; i ++) {
		cin >> x >> y;
		for (int j = 1; j <= t; j ++) cin >> w[x][y][j];
		for (int j = 1; j <= t; j ++) w[y][x][j] = w[x][y][j];
		to[x].emplace_back(y), to[y].emplace_back(x);
	}
	for (int i = 1; i <= n; i ++) cin >> c[i];
	for (int i = 1; i <= t; i ++) {
		for (int j = 1; j <= n; j ++) {
			for (int k : to[j]) {
				if (nxt[i - 1][k] != j) {
					if (dp[i][j] > dp[i - 1][k] + w[k][j][i]) dp[i][j] = dp[i - 1][k] + w[k][j][i], nxt[i][j] = k;
					else if (dp[i][j] == dp[i - 1][k] + w[k][j][i]) nxt[i][j] = -1;
				} else {
					if (dp[i][j] > dp[i - 1][k] + w[k][j][i] + c[k]) dp[i][j] = dp[i - 1][k] + w[k][j][i] + c[k], nxt[i][j] = k;
					else if (dp[i][j] == dp[i - 1][k] + w[k][j][i] + c[k]) nxt[i][j] = -1;
				}
			}
		}
	}
	int ans = 0x3f3f3f3f3f3f3f3f;
	for (int i = 1; i <= n; i ++) ans = min(ans, dp[t][i]);
	cout << ans << '\n';
	return ;
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	freopen("aviation.in", "r", stdin);
//	freopen("aviation.out", "w", stdout);
	int T;
	cin >> T;
	while (T --) solve();
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...