昨晚那道题【P6464 传送门】搞了3个小时,都没过样例,很受伤。。。
今天刷完本题后,就摸了10分钟,被抓了个现行。太欺负小孩了。。。
今天主要学习了最短路,战绩马马虎虎,题目都不算太难。
Atcoder国家有N个城镇,由M条双向可移动的道路连接而成。
另外,第i条路是町
和城镇
之间的距离用
连接。
姐姐要去这个国家的R个城市
。
她将飞往她访问的第一个城镇,然后从她访问的最后一个城镇飞回来,但在接下来的行程中,她将不得不通过公路旅行。
请回答访问城市的顺序,决定道路的移动距离最小时的移动距离。
...... r
B
C
B
C
将访问城市的顺序输出为道路上的移动距离最小的距离。
3 3 3
1 2 3
1 2 1
2 3 1
3 1 4
2
例如,按照町1、町2、町3的顺序访问的话,移动距离为2,最小。
3 3 2
1 3
2 3 2
1 3 6
1 2 2
4
无论是访问了町1之后访问町3,还是访问了町3之后访问町1,町1和町3之间的最短距离都是4,所以无论选择哪个顺序,答案都是4。
4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6
3
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';
void best_coder() {
int n, m, r;
cin >> n >> m >> r;
vector<vector<int>> g(n, vector<int>(n, 1e9));
vector<int> l(r);
for (int i = 0; i < r; ++i) {
cin >> l[i];
--l[i];
}
sort(l.begin(), l.end());
for (int i = 0; i < m; ++i) { //存储边的情况
int u, v, w;
cin >> u >> v >> w;
--u;
--v;
g[u][v] = w;
g[v][u] = w;
}
for (int i = 0; i < n; ++i) {
g[i][i] = 0;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (j == i) {
continue;
}
for (int s = 0; s < n; ++s) {
if (s == i || s == j) {
continue;
}
g[j][s] = min(g[j][s], g[i][s] + g[j][i]);
}
}
}
int ans = 1e9;
do {
int cnt = 0;
for (int i = 0; i < r - 1; ++i) {
cnt += g[l[i]][l[i + 1]];
}
ans = min(cnt, ans);
} while (next_permutation(l.begin(), l.end()));
cout << ans;
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}