티스토리 뷰
#include <stdio.h>
typedef struct Node{int u, v, d}Node; //간선 구조체
int find(int p[], int x) { //노드가 속한 부분집합의 대표 노드 찾기
if(x == p[x]) return x;
return p[x] = find(p, p[x]);
}
void merge(int p[], int x, int y) { // 두노드의 부분집합 합치기
x = find(p, x);
y = find(p, y);
if(x!=y) p[x] = y;
}
int main(void) {
int n, m, i, j, gap, cnt = 0, treeCnt = 0;
scanf("%d %d", &n, &m);
int p[n+1]; //노드가 속한 부분집합의 대표 노드 저장
char isTree[n+1]; //부분집합의 대표노드인가?
char gender[n+1]; //노드의 성별
Node g[m]; //간선을 담을 구조체 배열
Node key;
for(i=1; i<=n; i++) { //성별
scanf(" %c", &gender[i]);
p[i] = i;
isTree[i] = 0;
}
for(i=0; i<m; i++) { //간선
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
if(gender[x] != gender[y]) { //다른 성별이면 간선 생성
g[cnt].u = x;
g[cnt].v = y;
g[cnt].d = z;
cnt++;
}
}
gap = cnt/2;
while(1) { //shell sort
if(gap%2==0) gap++;
for(i=gap; i<cnt; i++) {
key = g[i];
for(j=i-gap; j>=0; j-=gap) {
if(key.d < g[j].d) g[j+gap] = g[j];
else break;
}
g[j+gap] = key;
}
if(gap == 1) break;
gap >>= 1;
}
int ans = 0; //mst의 가중치 총합
for(int i=0; i<cnt; i++) { //krustal 알고리즘, 단 아직 mst을 만들 수 있을 지는 모른다.
if(find(p, g[i].u) != find(p, g[i].v)) {
ans += g[i].d;
merge(p, g[i].u, g[i].v);
}
}
//부분집합의 개수 찾기
for(int i=1; i<=n; i++) isTree[find(p, i)] = 1;
for(int i=1; i<=n; i++) if(isTree[i]) {
treeCnt++;
if(treeCnt>1) break;
}
if(treeCnt > 1) printf("-1"); //부분집합이 2개 이상이면, mst가 불가하다!
else printf("%d", ans); //mst가 존재하며, 이 때의 가중치의 총합을 출력하면 된다.
return 0;
}
풀이 : Krustal 알고리즘, union-find
1. n, m입력받습니다.
2. 성별을 입력받습니다.
3. 간선을 입력받습니다. 만약 두 대학이 같은 성별이면, 간성을 생성하지 않습니다.
4. 생성한 간선을 가중치를 기준으로 오름차순 정렬합니다.
5. mst가 있다고 생각하고 krustal알고리즘으로 mst의 가중치의 합을 구합니다.
6. 부분집합의 개수를 셉니다. 만약 2개이상이라면 mst는 존재하지 않습니다.
7. 부분집합이 2개이상이면 -1을, 1개라면 mst가 있다는 의미이니, mst의 가중치를 출력합니다.
https://www.acmicpc.net/submit/14621/58334174
로그인
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 10423번 전기가 부족해 (백준) (0) | 2023.03.29 |
---|---|
c언어 13418번 학교 탐방하기 (백준) (0) | 2023.03.29 |
c언어 1774번 우주신과의 교감 (백준) (0) | 2023.03.29 |
c언어 1414번 불우이웃돕기 (백준) (0) | 2023.03.28 |
c언어 16398번 행성 연결 (백준) (0) | 2023.03.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C++
- 덱
- 그리디
- 정렬
- 세그먼트 트리
- 백준
- 그래프
- 누적 합
- Lazy Propagation
- DP
- Krustal
- find
- DFS
- union
- 1835번
- 최대공약수
- 누적합
- 기하학
- 플로이드
- 오프라인 쿼리
- 브루트포스
- PASCAL
- XOR
- 1835
- java
- C언어
- 스택
- Segment Tree
- 최소 스패닝 트리
- BFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함