플로이드 워셜 알고리즘을 사용한 간단한 문제이다.
플로이드 워셜 결과를 수행하고 나면 모든 점에서 다른 모든 점으로 가는 최소 비용을 구할 수 있는데, 이 값을 제시된 시간값과 비교하면 된다.

#include <iostream>
#include <vector>
#define MAXINT 2100000000
using namespace std;
void input_data(vector<vector<int>> &party_room, vector<vector<int>> &guest_data)
{
cout << "\ninput_data()\n";
int N, M;
int T, A, B, C;
int i, j;
cin >> N >> M;
party_room.resize(N + 1, vector<int>(N + 1, MAXINT));
for (i = 1; i < party_room.size(); i++)
{
for (j = 1; j < party_room[i].size(); j++)
{
cin >> T;
party_room[i][j] = T;//단방향
}
}
for (i = 0; i < M; i++)
{
cin >> A >> B >> C;
guest_data.push_back({ A, B, C });
}
return;
}
void floyd_warshall(vector<vector<int>>& party_room)
{
cout << "\nfloyd_warshall()\n";
int i, j, k;
int N = party_room.size();
for (k = 1; k < N; k++)
{
for (i = 1; i < N; i++)
{
for (j = 1; j < N; j++)
{
party_room[i][j] = min(party_room[i][j], party_room[i][k] + party_room[k][j]);
}
}
}
cout << "플로이드 워셜 결과\n";
for (i = 1; i < N; i++)
{
for (j = 1; j < N; j++)
{
cout << party_room[i][j] << " ";
}
cout << "\n";
}
return;
}
void find_guest_is_able_to_arrive_party(vector<vector<int>>& party_room, vector<vector<int>>& guest_data)
{
cout << "\nfind_guest_is_able_to_arrive_party()\n";
int i, N = party_room.size(), M = guest_data.size();
int A, B, C;
for (i = 0; i < M; i++)
{
A = guest_data[i][0];
B = guest_data[i][1];
C = guest_data[i][2];
cout << A << "에서 " << B << "까지 " << party_room[A][B] << "시간이 걸리는데 " << C << "시간 내에 이동 가능?\n";
if (party_room[A][B] <= C)
{
cout << "Enjoy other party\n";
}
else
{
cout << "Stay here\n";
}
}
return;
}
void find_answer(vector<vector<int>>& party_room, vector<vector<int>>& guest_data)
{
cout << "\nfind_answer()\n";
floyd_warshall(party_room);
find_guest_is_able_to_arrive_party(party_room, guest_data);
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<vector<int>> party_room;
vector<vector<int>> guest_data;
input_data(party_room, guest_data);
find_answer(party_room, guest_data);
return 0;
}