이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define pii pair<long long, int>
using namespace std;
int N, K, M;
int id[10];
vector<pii> adj[100005];
long long dist[7][100005];
long long dist2[7][7][100005];
priority_queue<pii, vector<pii>, greater<pii>> pq;
void BFS(int now) {
int st = id[now];
pq.emplace(0, st);
dist[now][st] = 0;
int u, v;
long long len, w;
while(!pq.empty()) {
u = pq.top().second;
len = pq.top().first;
pq.pop();
if(dist[now][u] < len) continue;
for(pii tmp : adj[u]) {
v = tmp.second;
w = tmp.first;
if(dist[now][v] > dist[now][u] + w) {
dist[now][v] = dist[now][u] + w;
pq.emplace(dist[now][v], v);
}
}
}
}
void BFS2(int a, int b) {
for(int i = 1; i <= N; i++) {
pq.emplace(dist2[a][b][i], i);
}
int u, v;
long long len, w;
while(!pq.empty()) {
u = pq.top().second;
len = pq.top().first;
pq.pop();
if(dist2[a][b][u] < len) continue;
for(pii tmp : adj[u]) {
v = tmp.second;
w = tmp.first;
if(dist2[a][b][v] > dist2[a][b][u] + w) {
dist2[a][b][v] = dist2[a][b][u] + w;
pq.emplace(dist2[a][b][v], v);
}
}
}
}
int main() {
memset(dist, 0x3f3f3f3f, sizeof(dist));
memset(dist2, 0x3f3f3f3f, sizeof(dist2));
ios_base::sync_with_stdio(0);
cin >> N >> K >> M;
int u, v;
long long w;
for(int i = 1; i <= K; i++) cin >> id[i];
for(int i = 1; i <= M; i++) {
cin >> u >> v >> w;
adj[u].emplace_back(w, v);
adj[v].emplace_back(w, u);
}
for(int i = 1; i <= K; i++) {
BFS(i);
for(int k = 1; k <= N; k++) {
dist2[i][i][k] = dist[i][k];
}
for(int j = 1; j < i; j++) {
for(int k = 1; k <= N; k++) {
dist2[i][j][k] = dist[i][k] + dist[j][k];
}
BFS2(i, j);
}
}
for(int i = 1; i <= K; i++) {
for(int j = i + 1; j <= K; j++) {
for(int k = 1; k <= N; k++) {
dist2[i][j][k] = dist2[j][i][k];
}
}
}
long long ans = LLONG_MAX;
if(K == 2) {
ans = dist[1][id[2]];
}else if(K == 3) {
for(int i = 1; i <= N; i++) {
ans = min(ans, dist[1][i] + dist[2][i] + dist[3][i]);
}
}else if(K == 4) {
for(int i = 1; i <= N; i++) {
ans = min(ans, dist2[1][3][i] + dist2[2][4][i]);
ans = min(ans, dist2[1][2][i] + dist2[3][4][i]);
ans = min(ans, dist2[1][4][i] + dist2[2][3][i]);
}
}else {
for(int i = 1; i <= N; i++) {
ans = min(ans, dist2[1][2][i] + dist2[3][4][i] + dist[5][i]);
ans = min(ans, dist2[1][2][i] + dist2[3][5][i] + dist[4][i]);
ans = min(ans, dist2[1][2][i] + dist2[4][3][i] + dist[5][i]);
ans = min(ans, dist2[1][2][i] + dist2[4][5][i] + dist[3][i]);
ans = min(ans, dist2[1][2][i] + dist2[5][3][i] + dist[4][i]);
ans = min(ans, dist2[1][2][i] + dist2[5][4][i] + dist[3][i]);
ans = min(ans, dist2[1][3][i] + dist2[2][4][i] + dist[5][i]);
ans = min(ans, dist2[1][3][i] + dist2[2][5][i] + dist[4][i]);
ans = min(ans, dist2[1][3][i] + dist2[4][2][i] + dist[5][i]);
ans = min(ans, dist2[1][3][i] + dist2[4][5][i] + dist[2][i]);
ans = min(ans, dist2[1][3][i] + dist2[5][2][i] + dist[4][i]);
ans = min(ans, dist2[1][3][i] + dist2[5][4][i] + dist[2][i]);
ans = min(ans, dist2[1][4][i] + dist2[2][3][i] + dist[5][i]);
ans = min(ans, dist2[1][4][i] + dist2[2][5][i] + dist[3][i]);
ans = min(ans, dist2[1][4][i] + dist2[3][2][i] + dist[5][i]);
ans = min(ans, dist2[1][4][i] + dist2[3][5][i] + dist[2][i]);
ans = min(ans, dist2[1][4][i] + dist2[5][2][i] + dist[3][i]);
ans = min(ans, dist2[1][4][i] + dist2[5][3][i] + dist[2][i]);
ans = min(ans, dist2[1][5][i] + dist2[2][3][i] + dist[4][i]);
ans = min(ans, dist2[1][5][i] + dist2[2][4][i] + dist[3][i]);
ans = min(ans, dist2[1][5][i] + dist2[3][2][i] + dist[4][i]);
ans = min(ans, dist2[1][5][i] + dist2[3][4][i] + dist[2][i]);
ans = min(ans, dist2[1][5][i] + dist2[4][2][i] + dist[3][i]);
ans = min(ans, dist2[1][5][i] + dist2[4][3][i] + dist[2][i]);
ans = min(ans, dist2[2][1][i] + dist2[3][4][i] + dist[5][i]);
ans = min(ans, dist2[2][1][i] + dist2[3][5][i] + dist[4][i]);
ans = min(ans, dist2[2][1][i] + dist2[4][3][i] + dist[5][i]);
ans = min(ans, dist2[2][1][i] + dist2[4][5][i] + dist[3][i]);
ans = min(ans, dist2[2][1][i] + dist2[5][3][i] + dist[4][i]);
ans = min(ans, dist2[2][1][i] + dist2[5][4][i] + dist[3][i]);
ans = min(ans, dist2[2][3][i] + dist2[1][4][i] + dist[5][i]);
ans = min(ans, dist2[2][3][i] + dist2[1][5][i] + dist[4][i]);
ans = min(ans, dist2[2][3][i] + dist2[4][1][i] + dist[5][i]);
ans = min(ans, dist2[2][3][i] + dist2[4][5][i] + dist[1][i]);
ans = min(ans, dist2[2][3][i] + dist2[5][1][i] + dist[4][i]);
ans = min(ans, dist2[2][3][i] + dist2[5][4][i] + dist[1][i]);
ans = min(ans, dist2[2][4][i] + dist2[1][3][i] + dist[5][i]);
ans = min(ans, dist2[2][4][i] + dist2[1][5][i] + dist[3][i]);
ans = min(ans, dist2[2][4][i] + dist2[3][1][i] + dist[5][i]);
ans = min(ans, dist2[2][4][i] + dist2[3][5][i] + dist[1][i]);
ans = min(ans, dist2[2][4][i] + dist2[5][1][i] + dist[3][i]);
ans = min(ans, dist2[2][4][i] + dist2[5][3][i] + dist[1][i]);
ans = min(ans, dist2[2][5][i] + dist2[1][3][i] + dist[4][i]);
ans = min(ans, dist2[2][5][i] + dist2[1][4][i] + dist[3][i]);
ans = min(ans, dist2[2][5][i] + dist2[3][1][i] + dist[4][i]);
ans = min(ans, dist2[2][5][i] + dist2[3][4][i] + dist[1][i]);
ans = min(ans, dist2[2][5][i] + dist2[4][1][i] + dist[3][i]);
ans = min(ans, dist2[2][5][i] + dist2[4][3][i] + dist[1][i]);
ans = min(ans, dist2[3][1][i] + dist2[2][4][i] + dist[5][i]);
ans = min(ans, dist2[3][1][i] + dist2[2][5][i] + dist[4][i]);
ans = min(ans, dist2[3][1][i] + dist2[4][2][i] + dist[5][i]);
ans = min(ans, dist2[3][1][i] + dist2[4][5][i] + dist[2][i]);
ans = min(ans, dist2[3][1][i] + dist2[5][2][i] + dist[4][i]);
ans = min(ans, dist2[3][1][i] + dist2[5][4][i] + dist[2][i]);
ans = min(ans, dist2[3][2][i] + dist2[1][4][i] + dist[5][i]);
ans = min(ans, dist2[3][2][i] + dist2[1][5][i] + dist[4][i]);
ans = min(ans, dist2[3][2][i] + dist2[4][1][i] + dist[5][i]);
ans = min(ans, dist2[3][2][i] + dist2[4][5][i] + dist[1][i]);
ans = min(ans, dist2[3][2][i] + dist2[5][1][i] + dist[4][i]);
ans = min(ans, dist2[3][2][i] + dist2[5][4][i] + dist[1][i]);
ans = min(ans, dist2[3][4][i] + dist2[1][2][i] + dist[5][i]);
ans = min(ans, dist2[3][4][i] + dist2[1][5][i] + dist[2][i]);
ans = min(ans, dist2[3][4][i] + dist2[2][1][i] + dist[5][i]);
ans = min(ans, dist2[3][4][i] + dist2[2][5][i] + dist[1][i]);
ans = min(ans, dist2[3][4][i] + dist2[5][1][i] + dist[2][i]);
ans = min(ans, dist2[3][4][i] + dist2[5][2][i] + dist[1][i]);
ans = min(ans, dist2[3][5][i] + dist2[1][2][i] + dist[4][i]);
ans = min(ans, dist2[3][5][i] + dist2[1][4][i] + dist[2][i]);
ans = min(ans, dist2[3][5][i] + dist2[2][1][i] + dist[4][i]);
ans = min(ans, dist2[3][5][i] + dist2[2][4][i] + dist[1][i]);
ans = min(ans, dist2[3][5][i] + dist2[4][1][i] + dist[2][i]);
ans = min(ans, dist2[3][5][i] + dist2[4][2][i] + dist[1][i]);
ans = min(ans, dist2[4][1][i] + dist2[2][3][i] + dist[5][i]);
ans = min(ans, dist2[4][1][i] + dist2[2][5][i] + dist[3][i]);
ans = min(ans, dist2[4][1][i] + dist2[3][2][i] + dist[5][i]);
ans = min(ans, dist2[4][1][i] + dist2[3][5][i] + dist[2][i]);
ans = min(ans, dist2[4][1][i] + dist2[5][2][i] + dist[3][i]);
ans = min(ans, dist2[4][1][i] + dist2[5][3][i] + dist[2][i]);
ans = min(ans, dist2[4][2][i] + dist2[1][3][i] + dist[5][i]);
ans = min(ans, dist2[4][2][i] + dist2[1][5][i] + dist[3][i]);
ans = min(ans, dist2[4][2][i] + dist2[3][1][i] + dist[5][i]);
ans = min(ans, dist2[4][2][i] + dist2[3][5][i] + dist[1][i]);
ans = min(ans, dist2[4][2][i] + dist2[5][1][i] + dist[3][i]);
ans = min(ans, dist2[4][2][i] + dist2[5][3][i] + dist[1][i]);
ans = min(ans, dist2[4][3][i] + dist2[1][2][i] + dist[5][i]);
ans = min(ans, dist2[4][3][i] + dist2[1][5][i] + dist[2][i]);
ans = min(ans, dist2[4][3][i] + dist2[2][1][i] + dist[5][i]);
ans = min(ans, dist2[4][3][i] + dist2[2][5][i] + dist[1][i]);
ans = min(ans, dist2[4][3][i] + dist2[5][1][i] + dist[2][i]);
ans = min(ans, dist2[4][3][i] + dist2[5][2][i] + dist[1][i]);
ans = min(ans, dist2[4][5][i] + dist2[1][2][i] + dist[3][i]);
ans = min(ans, dist2[4][5][i] + dist2[1][3][i] + dist[2][i]);
ans = min(ans, dist2[4][5][i] + dist2[2][1][i] + dist[3][i]);
ans = min(ans, dist2[4][5][i] + dist2[2][3][i] + dist[1][i]);
ans = min(ans, dist2[4][5][i] + dist2[3][1][i] + dist[2][i]);
ans = min(ans, dist2[4][5][i] + dist2[3][2][i] + dist[1][i]);
ans = min(ans, dist2[5][1][i] + dist2[2][3][i] + dist[4][i]);
ans = min(ans, dist2[5][1][i] + dist2[2][4][i] + dist[3][i]);
ans = min(ans, dist2[5][1][i] + dist2[3][2][i] + dist[4][i]);
ans = min(ans, dist2[5][1][i] + dist2[3][4][i] + dist[2][i]);
ans = min(ans, dist2[5][1][i] + dist2[4][2][i] + dist[3][i]);
ans = min(ans, dist2[5][1][i] + dist2[4][3][i] + dist[2][i]);
ans = min(ans, dist2[5][2][i] + dist2[1][3][i] + dist[4][i]);
ans = min(ans, dist2[5][2][i] + dist2[1][4][i] + dist[3][i]);
ans = min(ans, dist2[5][2][i] + dist2[3][1][i] + dist[4][i]);
ans = min(ans, dist2[5][2][i] + dist2[3][4][i] + dist[1][i]);
ans = min(ans, dist2[5][2][i] + dist2[4][1][i] + dist[3][i]);
ans = min(ans, dist2[5][2][i] + dist2[4][3][i] + dist[1][i]);
ans = min(ans, dist2[5][3][i] + dist2[1][2][i] + dist[4][i]);
ans = min(ans, dist2[5][3][i] + dist2[1][4][i] + dist[2][i]);
ans = min(ans, dist2[5][3][i] + dist2[2][1][i] + dist[4][i]);
ans = min(ans, dist2[5][3][i] + dist2[2][4][i] + dist[1][i]);
ans = min(ans, dist2[5][3][i] + dist2[4][1][i] + dist[2][i]);
ans = min(ans, dist2[5][3][i] + dist2[4][2][i] + dist[1][i]);
ans = min(ans, dist2[5][4][i] + dist2[1][2][i] + dist[3][i]);
ans = min(ans, dist2[5][4][i] + dist2[1][3][i] + dist[2][i]);
ans = min(ans, dist2[5][4][i] + dist2[2][1][i] + dist[3][i]);
ans = min(ans, dist2[5][4][i] + dist2[2][3][i] + dist[1][i]);
ans = min(ans, dist2[5][4][i] + dist2[3][1][i] + dist[2][i]);
ans = min(ans, dist2[5][4][i] + dist2[3][2][i] + dist[1][i]);
}
}
cout << ans << "\n";
cin >> N;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |