일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- redis
- JPA
- Spring
- 디자인 패턴
- JavaScript
- OS
- c언어
- Algorithm
- Java
- Proxy
- 알고리즘
- C
- 자바
- 파이썬
- design pattern
- spring webflux
- Kafka
- 네트워크
- 백준
- MySQL
- 컴퓨터구조
- Galera Cluster
- Heap
- 자료구조
- react
- IT
- 운영체제
- mongoDB
- Data Structure
- MSA
Archives
- Today
- Total
시냅스
크루스칼 알고리즘 C언어로 구현 본문
크루스칼 알고리즘 Kruskal algorithm
- 모든 정점을 독립적인 집합으로 만든다.
- 모든 간선을 비용을 기준으로 정렬하고, 비용이 작은 간선부터 양 끝의 두 정점을 비교한다.
- 두 정점 사이 사이클이 발생하지 않으면(DFS) 정점을 연결한다.
탐욕 알고리즘을 기초로 하고 있음 (당장 눈 앞의 최소 비용을 선택해서, 결과적으로 최적의 솔루션을 찾음)
c언어로 구현
- 간선 가중치를 최소 값으로 오름차순 정렬
- dfs를 통해 사이클을 갖고 있는지 확인
Heap *sorted_heap(LinkedGraph *graph)
// 간선의 가중치를 기준으로 최소로 정렬한다.
// 여기에선 key가 가중치가 된다.
{
Heap *temp = createHeap(graph->currentEdgeCount);
ListNode *listNode;
HeapNode insertNode = {0, };
for(int i = 0; i < graph->maxVertexCount; i++)
{
listNode = graph->ppAdjEdge[i]->headerNode.pLink;
while(listNode)
{
if (i < listNode->data.vertexID)
{
insertNode.from = i;
insertNode.to = listNode->data.vertexID;
insertNode.key = listNode->data.weight;
insertMinHeapNode(temp, insertNode);
}
listNode = listNode->pLink;
}
}
return (temp);
}
int traversal_dfs(LinkedGraph *graph, int from, int to)
// 만약 자기자신이 갖고 있는 정점이 연결하려는 to와 갖다면 연결하지 않는다.
// 이를 위해 dfs로 확인한다.
{
int *visited = calloc(graph->maxVertexCount, sizeof(int));
LinkedStack *stack = calloc(1, sizeof(LinkedStack));
ListNode *temp;
StackNode buf;
StackNode *stackNode;
buf.data = from;
pushLS(stack, buf);
visited[from] = 1;
while(!isLinkedStackEmpty(stack))
{
stackNode = popLS(stack);
if (stackNode->data == to)
return (FALSE);
temp = graph->ppAdjEdge[stackNode->data]->headerNode.pLink;
while(temp)
{
if (!visited[temp->data.vertexID])
{
visited[temp->data.vertexID] = 1;
buf.data = temp->data.vertexID;
pushLS(stack, buf);
}
temp = temp->pLink;
}
}
return (TRUE);
}
void kruskal(LinkedGraph *graph)
{
int all_edge = graph->currentVertexCount - 1;
Heap *heap = sorted_heap(graph);
HeapNode buf;
LinkedGraph *ret = createLinkedGraph(graph->maxVertexCount);
for(int i = 0; i < graph->currentEdgeCount; i++)
{
buf = popMinHeapNode(heap);
// 간선의 가중치가 오름차순 정렬이 되어있으므로 작은 값부터 연결해준다.
if (traversal_dfs(ret, buf.from, buf.to))
// 사이클이 발생하지 않았다면 ret이라는 그래프에 삽입한다.
{
addVertexLG(ret, buf.from);
addVertexLG(ret, buf.to);
addEdgewithWeightLG(ret, buf.from, buf.to, buf.key);
}
}
displayLinkedGraph(ret);
}
'알고리즘' 카테고리의 다른 글
다익스트라 알고리즘 C언어로 구현 (0) | 2022.06.07 |
---|---|
프림 알고리즘 C 언어로 구현 (0) | 2022.06.07 |
백준 boj 2529 - 부등호 (파이썬, python) (0) | 2022.03.01 |
백준 boj 15661 - 링크와 스타트 (파이썬, python) (0) | 2022.03.01 |
백준 boj 14501 - 퇴사 (파이썬, python) (0) | 2022.02.23 |
Comments