일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Kafka
- C
- Galera Cluster
- 자료구조
- Java
- 컴퓨터구조
- Heap
- MySQL
- mongoDB
- Data Structure
- 네트워크
- Algorithm
- 백준
- OS
- MSA
- spring webflux
- react
- 디자인 패턴
- IT
- Spring
- 운영체제
- design pattern
- c언어
- JPA
- JavaScript
- 알고리즘
- redis
- Proxy
- 자바
- 파이썬
Archives
- Today
- Total
시냅스
플로이드 알고리즘 C언어로 구현 본문
플로이드 알고리즘 Floyd algorithm
- 모든 지점에서 모든 지점으로의 최단 경로를 모두 구하는 경우
- 꼭짓점 k를 두고, k를 경유할 경우를 원래의 값과 비교하여 더 짧다면 업데이트 한다.
- (i,j) > (i,k) + (k,j) 와 같은 꼴이다.
- 다이나믹 프로그래밍 기술에 의거한다.
- 구현이 쉽고 간단하지만 O(n^3) 시간복잡도가 높다.
구현
int INF = 99999999;
int **arr_init(LinkedGraph *graph)
{
int **arr = calloc(graph->currentVertexCount, sizeof(int *));
ListNode *temp;
for(int i = 0; i < graph->currentVertexCount; i++)
arr[i] = calloc(graph->currentVertexCount, sizeof(int));
for (int i = 0; i < graph->currentVertexCount; i++)
{
for(int j = 0; j < graph->currentVertexCount; j++)
{
arr[i][j] = INF;
if (i == j)
arr[i][j] = 0;
}
}
for (int i = 0; i < graph->currentVertexCount; i++)
{
temp = graph->ppAdjEdge[i]->headerNode.pLink;
while(temp)
{
arr[i][temp->data.vertexID] = temp->data.weight;
temp = temp->pLink;
}
}
return arr;
}
void display(int **arr, int length)
{
for(int i = 0; i < length; i++)
{
for(int j = 0; j < length; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void floyd(LinkedGraph *graph)
{
int **arr = arr_init(graph); // 결과 그래프를 초기화한다.
for (int k = 0; k < graph->maxVertexCount; k++) // 꼭짓점 K
{
for(int j = 0; j < graph->maxVertexCount; j++)
{
for(int i = 0; i < graph->maxVertexCount; i++)
{
if (arr[i][j] > arr[i][k] + arr[k][j])
// (i,j) 가 (i,k) + (k,j)보다 크다면 업데이트한다.
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
display(arr, graph->maxVertexCount);
}
'알고리즘' 카테고리의 다른 글
다익스트라 알고리즘 C언어로 구현 (0) | 2022.06.07 |
---|---|
프림 알고리즘 C 언어로 구현 (0) | 2022.06.07 |
크루스칼 알고리즘 C언어로 구현 (0) | 2022.06.07 |
백준 boj 2529 - 부등호 (파이썬, python) (0) | 2022.03.01 |
백준 boj 15661 - 링크와 스타트 (파이썬, python) (0) | 2022.03.01 |
Comments