알고리즘/백준
[백준] 2644 촌수계산 c++
keepGGoing
2021. 3. 31. 08:39
문제
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진
www.acmicpc.net
문제 풀이
bfs사용
내가 푼 풀이...
찾아보니까 너무 복잡하게 생각한 것 같다.
더보기
하나의 노드를 확인할 때마다 visit을 확인해주어야 한다고 생각했다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<vector<int> > relation(101);
bool visit[101] = { false, };
int bfs(int x, int y) {
queue<pair<pair<int, int>,bool*> > q;//q:
q.push({ { x,0 },visit });
while (!q.empty()) {
int a = q.front().first.first;
int count = q.front().first.second;
visit[a] = true;
q.pop();
if (a == y)
return count;
for (int i = 0; i < relation[a].size(); i++)
{
if (relation[a][i] != a &&!visit[relation[a][i]]) {
q.push({ { relation[a][i], count + 1 },visit });
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;//사람의 수 : n, 관계의 개수 : m
int x, y, temp_x,temp_y;
cin >> n >> x >> y;
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> temp_x >> temp_y;
relation[temp_x].push_back(temp_y);
relation[temp_y].push_back(temp_x);
}
cout<<bfs(x, y);
return 0;
}
<더 간단한 코드>
pair을 사용하지 않고 노드 사이의 거리를 구하는 방법
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
vector<vector<int> > relation(101);
int visit[101] ;
int bfs(int x, int y) {
queue<int>q;
q.push(x);
visit[x] = 0;
while (!q.empty()) {
int a = q.front();
q.pop();
for (int i = 0; i < relation[a].size() ; i++)
{
if (visit[relation[a][i]]==-1)
q.push(relation[a][i]), visit[relation[a][i]] = visit[a]+ 1;
}
}
return visit[y];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;//사람의 수 : n, 관계의 개수 : m
int x, y, temp_x,temp_y;
cin >> n >> x >> y;
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> temp_x >> temp_y;
relation[temp_x].push_back(temp_y);
relation[temp_y].push_back(temp_x);
}
memset(visit, -1, sizeof(visit));
cout<<bfs(x, y);
return 0;
}