| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1370733 | TroySer | Telepathy (JOI25_telepathy) | C++20 | 0 ms | 0 KiB |
#include "telepathy.h"
#include <bits/stdc++.h>
using namespace std;
using ll = int;
const ll INF = 1e9;
vector<int> Aitana(int N, vector<int> A, vector<int> B, int S, int subtask) {
vector<vector<ll> > adjMat(N, vector<ll>(N, INF));
vector<vector<ll> > adjList(N);
for (ll i = 0; i < N; i++) {
adjMat[i][i] = 0;
}
for (ll i = 0; i < N - 1; i++) {
adjMat[A[i]][B[i]] = adjMat[B[i]][A[i]] = 1;
adjList[A[i]].push_back(B[i]);
adjList[B[i]].push_back(A[i]);
}
for (ll k = 0; k < N; k++) {
for (ll i = 0; i < N; i++) {
for (ll j = 0; j < N; j++) {
adjMat[i][j] = min(adjMat[i][j], adjMat[i][k] + adjMat[k][j]);
}
}
}
vector<ll> ends;
for (ll i = 0; i < N; i++) {
if (adjList[i].size() == 1) ends.push_back(i);
}
ll hasMnDist = -1;
for (ll i = 0; i < N; i++) {
if (adjMat[ends[0]][i] == N/2 && adjMat[ends[1]][i] == N/2) {
hasMnDist = i;
break;
}
if (adjMat[ends[0]][i] == N/2 - 1 && adjMat[ends[1]][i] == N/2) {
hasMnDist = i;
break;
}
}
ll currNode = S;
ll currDist = adjMat[currNode][hasMnDist];
vector<ll> currPath;
currPath.push_back(currNode);
while (currDist > 0) {
for (ll i = 0; i < N; i++) {
if (adjMat[currNode][i] > 1) continue;
if (adjMat[i][hasMnDist] == currDist - 1) {
currNode = i;
currDist--;
currPath.push_back(i);
break;
}
}
}
while (currPath.size() <= N/2 + 1) {
currPath.push_back(hasMnDist);
}
ll hasMnDist = ends[1];
for (ll i = 0; i < N; i++) {
if (adjMat[currNode][i] > 1) continue;
if (adjMat[i][hasMnDist] == currDist - 1) {
currNode = i;
currDist--;
currPath.push_back(i);
break;
}
}
while (currPath.size() <= 10*N) {
currPath.push_back(hasMnDist);
}
return currPath;
}
vector<int> Bruno(int N, vector<int> A, vector<int> B, int S, int subtask) {
vector<vector<ll> > adjMat(N, vector<ll>(N, INF));
vector<vector<ll> > adjList(N);
for (ll i = 0; i < N; i++) {
adjMat[i][i] = 0;
}
for (ll i = 0; i < N - 1; i++) {
adjMat[A[i]][B[i]] = adjMat[B[i]][A[i]] = 1;
adjList[A[i]].push_back(B[i]);
adjList[B[i]].push_back(A[i]);
}
for (ll k = 0; k < N; k++) {
for (ll i = 0; i < N; i++) {
for (ll j = 0; j < N; j++) {
adjMat[i][j] = min(adjMat[i][j], adjMat[i][k] + adjMat[k][j]);
}
}
}
vector<ll> ends;
for (ll i = 0; i < N; i++) {
if (adjList[i].size() == 1) ends.push_back(i);
}
ll hasMnDist = -1;
for (ll i = 0; i < N; i++) {
if (adjMat[ends[0]][i] == N/2 && adjMat[ends[1]][i] == N/2) {
hasMnDist = i;
break;
}
if (adjMat[ends[0]][i] == N/2 - 1 && adjMat[ends[1]][i] == N/2) {
hasMnDist = i;
break;
}
}
ll currNode = S;
ll currDist = adjMat[currNode][hasMnDist];
vector<ll> currPath;
currPath.push_back(currNode);
while (currDist > 0) {
for (ll i = 0; i < N; i++) {
if (adjMat[currNode][i] > 1) continue;
if (adjMat[i][hasMnDist] == currDist - 1) {
currNode = i;
currDist--;
currPath.push_back(i);
break;
}
}
}
while (currPath.size() <= 10*N) {
currPath.push_back(hasMnDist);
}
return currPath;
}
