티스토리 뷰
#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
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 16562번 친구비 (백준) (0) | 2023.03.19 |
---|---|
c언어 1034번 거짓말 (백준) (0) | 2023.03.19 |
c언어 1717번 집합의 표현 (백준) (1) | 2023.03.19 |
c언어 1644번 소수의 연속합 (백준) (0) | 2023.03.18 |
c언어 10942 팰린드롬 (백준) (0) | 2023.03.18 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- DFS
- 플로이드
- 트리
- 16120번
- 정렬
- 누적합
- 카드
- 최대공약수
- find
- 6198번
- 그리디
- 백준
- DP
- 덱
- 그래프
- java
- 최소 스패닝 트리
- 1835번
- C++
- BFS
- 오프라인 쿼리
- Mo.s
- C언어
- 세그먼트 트리
- 스택
- 6198
- 누적 합
- Krustal
- union
- 1835
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함