일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 최단 경로 알고리즘
- 트리의 지름 자바
- 가운데 글자 가져오기 java
- docker remove
- 프로그래머스 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 python
- docker 삭제
- 최소 스패닝 트리 자바
- 프로그래머스 가운데 글자 가져오기 자바
- 청년 Ai Big Data 아카데미
- 최소 스패닝 트리
- 트리의 지름 java
- docker 완전 삭제
- 코드업 1020 자바
- 빅분기실기
- 빅데이터분석기사
- 나누어 떨어지는 숫자 배열 java
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- 청년 AI Big Data 아카데미 13기
- codeup 1020 자바
- 가운데 글자 가져오기 파이썬
- codeup 1020 java
- 코드업 1020 java
- 프로그래머스 가운데 글자 가져오기 python
- m1 docker install
- m1 docker
- 가운데 글자 가져오기 자바
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- 나누어 떨어지는 숫자 배열 python
- 핸즈온 머신러닝
- Today
- Total
NineTwo meet you
[백준/자바] 14621 나만 안되는 연애 본문
문제
깽미는 24살 모태솔로이다. 깽미는 대마법사가 될 순 없다며 자신의 프로그래밍 능력을 이용하여 미팅 어플리케이션을 만들기로 결심했다. 미팅 앱은 대학생을 타겟으로 만들어졌으며 대학교간의 도로 데이터를 수집하여 만들었다.
이 앱은 사용자들을 위해 사심 경로를 제공한다. 이 경로는 3가지 특징을 가지고 있다.
- 사심 경로는 사용자들의 사심을 만족시키기 위해 남초 대학교와 여초 대학교들을 연결하는 도로로만 이루어져 있다.
- 사용자들이 다양한 사람과 미팅할 수 있도록 어떤 대학교에서든 모든 대학교로 이동이 가능한 경로이다.
- 시간을 낭비하지 않고 미팅할 수 있도록 이 경로의 길이는 최단 거리가 되어야 한다.
만약 도로 데이터가 만약 왼쪽의 그림과 같다면, 오른쪽 그림의 보라색 선과 같이 경로를 구성하면 위의 3가지 조건을 만족하는 경로를 만들 수 있다.
이때, 주어지는 거리 데이터를 이용하여 사심 경로의 길이를 구해보자.
입력
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000)
둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다.
다음 M개의 줄에 u v d가 주어지며 u학교와 v학교가 연결되어 있으며 이 거리는 d임을 나타낸다. (1 ≤ u, v ≤ N) , (1 ≤ d ≤ 1,000)
출력
깽미가 만든 앱의 경로 길이를 출력한다.
(모든 학교를 연결하는 경로가 없을 경우 -1을 출력한다.)
예제 입력 1 복사
5 7
M W W W M
1 2 12
1 3 10
4 2 5
5 2 5
2 5 10
3 4 3
5 4 7
예제 출력 1
34
설명
해당 문제는 다음 알고리즘 분류를 가진다.
- 그래프 이론
- 최소 스패닝 트리
최소 스패닝 트리를 해결하는 알고리즘 중 프림을 이용해 문제를 해결했다.
다만 입력을 받을때 해당 간선이 남초 대학교와 여초 대학교들을 연결하는 도로인지 확인해 맞는 간선만 추가했다.
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken())-1;
int b = Integer.parseInt(st.nextToken())-1;
int c = Integer.parseInt(st.nextToken());
// 남초 대학교와 여초 대학교들을 연결하는 도로일때 간선에 추가
if(!school[a].equals(school[b])) {
graph[a].add(new edge(b, c));
graph[b].add(new edge(a, c));
}
}
도로의 가중치를 오름차순을 배열하고 이를 이용해 우선순위 큐를 사용한다.
static class edge implements Comparable<edge> {
int node;
int weight;
edge(int node, int weight){
this.node = node;
this.weight = weight;
}
// 가중치를 오름차순으로 정렬
@Override
public int compareTo(edge o) {
return weight - o.weight;
}
}
대학교를 boolean으로 두고 해당 대학을 방문할때마다 true로 변경한다.
prim알고리즘이 끝나고 만약 false인 대학이 있다면 이는 연결되지 않은 대학이 있다는 말과 같다.
이때는 -1을 출력하고 아니라면 최단 경로의 길이를 출력한다.
코드
'프로그래밍 문제 > 백준' 카테고리의 다른 글
[백준/자바] 1865 웜홀 (0) | 2021.01.25 |
---|---|
[백준/자바] 16928 뱀과 사다리 게임 (0) | 2021.01.24 |
[백준/자바] 4386 별자리 만들기 (0) | 2021.01.24 |
[백준/자바] 16398 행성 연결 (0) | 2021.01.24 |
[백준/자바] 1647 도시 분할 계획 (0) | 2021.01.21 |