백준
백준 16958번 텔레포트 (c++)
딴짓거리
2025. 2. 18. 14:12
노드간의 최소 거리를 전부 구해놓고 출력만 하면 편할 것이고
텔레포트라는 개념도 있기 때문에 플로이드 워셜 알고리즘이 좋을 것이다.
void dist()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
graph[i][j] = 2100000000;
}
}
for (int i = 1; i <= n; i++)
{
int r1 = city[i].first;
int c1 = city[i].second;
for (int j = 1; j <= n; j++)
{
if (i == j)
{
graph[i][j] = 0;
continue;
}
int r2 = city[j].first;
int c2 = city[j].second;
graph[i][j] = abs(r1 - r2) + abs(c1 - c2);
if (tele[i] == 1 && tele[j] == 1) graph[i][j] = min(graph[i][j], t);
}
}
}
노드간의 거리를 구해준다
텔레포트가 가능한 노드간의 경우 따로 처리를 해주는데, 주의할 점은
텔레포트 하는 시간 t보다 노드간 직접 이동하는 시간이 짧은 경우가 있기 때문에
잘 비교해주고 값을 넣는다
void calc()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (graph[i][k] + graph[k][j] < graph[i][j])
{
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
}
플로이드 워셜 알고리즘을 사용해준다.
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);
cin >> n >> t;
for (int i = 1; i <= n; i++)
{
int s, x, y;
cin >> s >> x >> y;
city[i] = make_pair(x, y);
tele[i] = s;
}
cin >> m;
dist();
calc();
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
cout << graph[a][b] << endl;
}
}
값을 출력해주면 된다
플로이드 워셜 알고리즘을 직접 사용하면 되는 간단한 문제