社区讨论
站外题求助(玄关)
题目总版参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mibcbnij
- 此快照首次捕获于
- 2025/11/23 14:31 3 个月前
- 此快照最后确认于
- 2025/11/23 16:09 3 个月前
题目就是求一种最短路径,一条路径的长度为边权和+最大点权。
我的代码在极少数情况下会出错。这是一个Hack数据:但它太长了,应该排不上用场。
CPP预期输出:150
实际输出:151
20 42 1
25
80
17
92
18
15
73
72
10
93
26
56
62
53
14
63
37
98
100
63
12 1 90
14 10 18
20 19 29
14 2 19
17 10 38
14 16 55
20 9 37
9 5 49
7 3 68
19 9 12
11 10 89
8 17 28
1 18 34
14 1 56
17 13 11
14 4 12
8 19 37
2 1 27
13 14 5
7 6 35
5 2 33
6 14 27
9 2 72
5 14 15
16 3 70
17 3 91
4 9 39
5 13 25
10 19 12
6 4 33
1 10 37
20 7 65
3 20 96
2 13 87
5 10 83
17 19 68
6 17 53
2 4 32
15 4 21
3 5 34
12 19 37
20 16 17
4 1
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e15;
int main() {
int N, M, K;
cin >> N >> M >> K;
vector<ll> c(N + 1);
for (int i = 1; i <= N; ++i) {
cin >> c[i];
}
vector<ll> a(M + 1),b(M+1),l(M+1);
vector<vector<ll>> f(N+1,vector<ll>(N+1,INF)),g(N+1,vector<ll>(N+1,0));
for(int i=1;i<=N;++i)
{
f[i][i] = c[i];
g[i][i] = i;
}
for (int i = 0; i < M; ++i) {
int a, b, l;
cin >> a >> b >> l;
ll cost =l + max(c[a], c[b]);
if (cost < f[a][b]) {
f[a][b] = cost;
f[b][a] = cost;
if (c[a] > c[b]) {
g[a][b] = a;
g[b][a] = a;
} else {
g[a][b] = b;
g[b][a] = b;
}
}
}
for(int k=1;k<=N;++k)
{
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
ll m1=g[i][k],m2=g[k][j];
if(c[m1]>c[m2])swap(m1,m2);
if(f[i][j]>f[i][k]+f[k][j]-c[m1]){
f[i][j]=f[i][k]+f[k][j]-c[m1];
g[i][j]=m2;
}
}
}
}
for (int i = 0; i < K; ++i) {
int s, t;
cin >> s >> t;
cout << f[s][t] << endl;
}
return 0;
}
有人能帮我看看吗?谢谢。
回复
共 3 条回复,欢迎继续交流。
正在加载回复...