가장 먼 노드를 찾기 위해서 BFS를 적용할 수도 있었는데
나는 다익스트라 알고리즘을 적용해서 풀었다.
다익스트라는 한 노드에서 각 노드에 대해 가장 짧은 경로를 찾아준다.
따라서 다익스트라 결과에서 가장 큰 값을 찾고 같은 값이 몇개인지만 찾으면 된다.
#include <string>
#include <vector>
#include <cstring>
#define INF 1000000
using namespace std;
int map[20001][20001];
int dist[20001];
bool visit[20001];
void Dijkstra(int start, int n){
int cur, min, min_idx;
for(int i = 1; i <= n; i++)
dist[i] = map[start][i];
visit[start] = true;
for(int i = 0; i < n - 2; i++){
min = INF;
min_idx = 0;
for(int j = 1; j <= n; j++){
if(visit[j] == false && dist[j] < min){
min = dist[j];
min_idx = j;
}
}
cur = min_idx;
visit[cur] = true;
for(int j = 1; j <= n; j++){
if(visit[j] == false && dist[cur] + map[cur][j] < dist[j])
dist[j] = dist[cur] + map[cur][j];
}
}
}
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
vector<int> temp;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)
map[i][j] = INF;
}
memset(visit, false, sizeof(visit));
for(int i = 1; i <= n; i++)
map[i][i] = 0;
while(!edge.empty()){
temp = edge.back();
edge.pop_back();
map[temp[0]][temp[1]] = 1;
map[temp[1]][temp[0]] = 1;
}
Dijkstra(1, n);
int farest = -1;
for(int i = 1; i <= n; i++){
if(farest < dist[i]) farest = dist[i];
}
for(int i = 1; i <= n; i++){
if(dist[i] == farest) answer++;
}
return answer;
}
후기)
처음에 문제를 보고 해결방법은 바로 떠올랐는데 그 과정이 순탄하지 않았다.
1. 다익스트라를 까먹음 -> 그래도 금방 해결됨
2. memset이 원하는대로 되지 않음 -> ㅠㅠ
memset은 0과 char 타입으로 초기화할 때는 효과적이지만
임의의 int 타입을 집어넣으면 이상한 값이 들어간다.
그 이유는 memset이 1바이트 단위로 값을 초기화하기 때문이다!
그냥 BFS로 풀걸....
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 섬 연결하기 (2) | 2022.01.06 |
---|---|
[프로그래머스] 정수 삼각형 (9) | 2022.01.04 |
[프로그래머스] 등굣길 (0) | 2022.01.02 |
[프로그래머스] 네트워크 (1) | 2021.12.30 |
[프로그래머스] 모의고사 (1) | 2021.12.30 |