각 노드와 간선들을 정렬하고, 사이클 테이블도 각 노드가 자신을 가리키는 상태의 초기 상태이다.
첫 번째 간선을 선택해 연결한다.
사이클 테이블에서는 1과 7이 연결되었으므로 7의 부모노드를 1로 수정한다.
두 번째 간선을 선택하여 과정을 반복한다.
세 번째, 네 번째, 다섯 번째 간선을 선택한다.
여섯 번째 간선의 경우 1과 4가 이미 연결되어 있으므로, 사이클이 발생할 수 있기 때문에 간선을 무시하고 넘어간다.
이후 일곱 번째 간선까지 추가하면, 최소비용 신장트리가 완성된다.
이후 다른 간선들도 마찬가지로 추가하지 않으므로 알고리즘 수행이 완료된다.
Source Code
#include<iostream>
#include<algorithm>
#include<vector>usingnamespacestd;// 부모 노드를 가져옴 intgetParent(intset[],intx){if(set[x]==x)returnx;returnset[x]=getParent(set,set[x]);}// 부모 노드를 병합 voidunionParent(intset[],inta,intb){a=getParent(set,a);b=getParent(set,b);// 더 숫자가 작은 부모로 병합if(a<b)set[b]=a;elseset[a]=b;}// 같은 부모를 가지는지 확인intfind(intset[],inta,intb){a=getParent(set,a);b=getParent(set,b);if(a==b)return1;elsereturn0;}// 간선 클래스 선언 classEdge{public:intnode[2];intdistance;Edge(inta,intb,intdistance){this->node[0]=a;this->node[1]=b;this->distance=distance;}booloperator<(Edge&edge){returnthis->distance<edge.distance;}};intmain(void){intn=7;intm=11;vector<Edge>v;v.push_back(Edge(1,7,12));v.push_back(Edge(1,4,28));v.push_back(Edge(1,2,67));v.push_back(Edge(1,5,17));v.push_back(Edge(2,4,24));v.push_back(Edge(2,5,62));v.push_back(Edge(3,5,20));v.push_back(Edge(3,6,37));v.push_back(Edge(4,7,13));v.push_back(Edge(5,6,45));v.push_back(Edge(5,7,73));// 간선의 비용으로 오름차순 정렬 sort(v.begin(),v.end());// 각 정점이 포함된 그래프가 어디인지 저장 intset[n];for(inti=0;i<n;i++){set[i]=i;}// 거리의 합을 0으로 초기화 intsum=0;for(inti=0;i<v.size();i++){// 동일한 부모를 가르키지 않는 경우, 즉 사이클이 발생하지 않을 때만 선택 if(!find(set,v[i].node[0]-1,v[i].node[1]-1)){sum+=v[i].distance;unionParent(set,v[i].node[0]-1,v[i].node[1]-1);}}printf("%d\n",sum);}