크루스칼 알고리즘 관련하여
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
389
1
병합정렬 시간복잡도 질문
0
475
1
41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.
0
1365
2
질문드립니다.
0
392
1
질문드립니다!
0
437
1
dev 프로그램 질문
0
276
1
문제가 이해가 안되요
0
380
1
4번 나이차이 문제 접근법 질문 드립니다.
0
309
1
source file not compiled
0
1066
3
59번 질문드립니다.
0
376
1
25번 문제 질문
0
351
1
4. 나이차이 문제 질문입니다.
0
377
1
90번 라이언 킹 심바 1번 테스트 케이스
0
473
1
71번 문제 전역 변수 질문 있습니다
0
366
1
75번, 79번 priority_queue관련
1
361
1
75.최대 수입 스케줄
0
404
2
복면산 정답의 수
0
437
1
테스트 케이스에 대해서
0
450
1
수업 내용 질문입니다!
1
236
1
풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!
0
841
2
12. 플로이드-와샬(그래프 최단거리) . 27:25초
0
257
1
다른 풀이 방식
0
319
1
크루스칼 vs 프림
0
314
1
숫자 총개수 small 질문있습니다.
0
246
1





