티스토리 뷰
#include <stdio.h>
#include <stdlib.h>
int find(int parent[], int x) {
if(parent[x] == x) return x;
return parent[x] = find(parent, parent[x]);
}
void merge(int parent[], int x, int y) {
x = find(parent, x);
y = find(parent, y);
if(x != y) parent[x] = y;
return;
}
int same(int parent[], int x, int y) {
x = find(parent, x);
y = find(parent, y);
return x == y;
}
int main(void) {
int n, m;
scanf("%d", &n);
scanf("%d", &m);
int* parent = (int*) malloc(sizeof(int) * (n+1));
for(int i=1; i<=n; i++) parent[i] = i;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
int tmp = 0;
scanf("%d", &tmp);
if(tmp) merge(parent, i, j);
}
}
int before = 0;
int i=0;
for(i=0; i<m; i++) {
int tmp = 0;
scanf("%d", &tmp);
if(before) {
if(!same(parent, before, tmp)) {
break;
}
}
before = tmp;
}
if(i==m) printf("YES");
else printf("NO");
}
풀이 : union(합집합) find(찾기)
1. n, m을 입력받습니다.
2. 모든 도시의 연결 정보를 입력 받고, 연결이 되있다고 한다면, 같은 집합으로 (merge) 묶습니다.
3. m만큼의 여행 계획을 입력 받으며, 받는 동안, 전에 도시와 지금 입력받은 도시가 연결되어 있는지를 확인합니다.
만약 반복문 도중에 연결이 되지 않았다면, break을 한 다음, NO을 출력하며, 반복문을 다 돌고 나오면 모든 여행계획에 있는 도시들이 연결되어있다는 의미이므로 YES를 출력합니다.
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 16562번 친구비 (백준) (0) | 2023.03.19 |
---|---|
c언어 1034번 거짓말 (백준) (0) | 2023.03.19 |
c언어 1717번 집합의 표현 (백준) (0) | 2023.03.19 |
c언어 1644번 소수의 연속합 (백준) (0) | 2023.03.18 |
c언어 10942 팰린드롬 (백준) (0) | 2023.03.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Lazy Propagation
- find
- 브루트포스
- union
- 누적합
- BFS
- 최대공약수
- 그래프
- 덱
- 정렬
- DFS
- 1835번
- 1835
- Segment Tree
- 오프라인 쿼리
- 그리디
- 스택
- Krustal
- C언어
- 플로이드
- DP
- 세그먼트 트리
- 최소 스패닝 트리
- PASCAL
- 기하학
- C++
- 누적 합
- 백준
- XOR
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함