크루스칼 알고리즘 관련하여
321
작성한 질문수 8
아래가 수업도중에 배운 알고리즘인데요!
------------------------------------------
int main(void)
{
int v, e, city_a, city_b, cost, i, res, cnt;
vector<Edge> Ed;
res = cnt = 0;
cin >> v >> e;
for (i = 1; i <= e; i++) {
unf[i] = i;
}
for (i = 0; i < e; i++)
{
cin >> city_a >> city_b >> cost;
Ed.push_back(Edge(city_a, city_b, cost));
}
sort(Ed.begin(), Ed.end());
for (i = 0; i < m; i++)
{
int fa = Find(Ed[i].v1);
int fb = Find(Ed[i].v2);
if (fa != fb) {
res += Ed[i].cost;
Union(Ed[i].v1, Ed[i].v2);
}
}
cout << res << endl;
return 0;
}
------------------------------------------
이 중에서 간선을 선택하는
for (i = 0; i < m; i++)
{
int fa = Find(Ed[i].v1);
int fb = Find(Ed[i].v2);
if (fa != fb) {
res += Ed[i].cost;
Union(Ed[i].v1, Ed[i].v2);
}
}
이 부분에 대해 궁금증이 있습니다!
크루스칼은 n개의 정점이 주어지면 n-1 개의 간선을 최소 가중치를 기준으로 선택하는 것으로 알고 있습니다.
그런데 문제에선 n-1개라는 기준을 사용하지 않았는데 그 이유가 있을까요? 선생님의 문제풀이에서 cnt 변수를 만드셨으나 사용하지 않으셨는데, 이를 체크하려다 체크하지 않으신 것 같습니다. 그 이유는 무엇인지 궁금합니다.
답변 1
0
안녕하세요^^
N개의 정점으로 구성된 그래프에서 회로를 피하면서 N-1개의 간선을 선택하면 N개의 정점이 모두 연결된 트리가 됩니다. 즉 N개의 정점이 모두 한 집합이 되었다는 얘기입니다. 그러므로 N-1개의 간선이 선택된 이후부터는 for문이 계속 돌아도 if (fa != fb) 조건이 참이 되지 않아 더이상 간선이 선택되는 일은 없습니다.
테스트 케이스 질문
0
412
1
병합정렬 시간복잡도 질문
0
497
1
41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.
0
1387
2
질문드립니다.
0
408
1
질문드립니다!
0
457
1
dev 프로그램 질문
0
289
1
문제가 이해가 안되요
0
396
1
4번 나이차이 문제 접근법 질문 드립니다.
0
322
1
source file not compiled
0
1108
3
59번 질문드립니다.
0
406
1
25번 문제 질문
0
413
1
4. 나이차이 문제 질문입니다.
0
400
1
90번 라이언 킹 심바 1번 테스트 케이스
0
486
1
71번 문제 전역 변수 질문 있습니다
0
380
1
75번, 79번 priority_queue관련
1
378
1
75.최대 수입 스케줄
0
420
2
복면산 정답의 수
0
450
1
테스트 케이스에 대해서
0
472
1
수업 내용 질문입니다!
1
251
1
풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!
0
866
2
12. 플로이드-와샬(그래프 최단거리) . 27:25초
0
271
1
다른 풀이 방식
0
335
1
크루스칼 vs 프림
0
329
1
숫자 총개수 small 질문있습니다.
0
254
1





