본문 바로가기
Algorithms/graphs

minimum spanning tree 알고리즘

by OKOK 2021. 6. 21.

- 네트워크(가중치가 간선에 할당된 그래프)에 있는 모든 정점들을 가장 적은 비용으로 연결하는 트리

- 가공된 데이터를 사용하는 것을 배움

#include<stdio.h>

int V;
int graph[100][100];

int minKey(int* key, unsigned char* mstSet)
{
    int min = 2147483647;
    int min_index;

    for (int v = 0; v < V; v++)
    {
        if (mstSet[v] == 0 && key[v] < min)
        {
            min = key[v];
            min_index = v;
        }
    }

    return min_index;
}

void printMST(int parent[])
{
    int weightSum = 0;
    for (int i = 1; i < V; i++)
    {
        weightSum += graph[i][parent[i]];
    }
    printf("%d\n", weightSum);
}

void primMST()
{
    int parent[100];
    int key[100];
    unsigned char mstSet[100];

    for (int i = 0; i < V; i++)
    {
        key[i] = 2147483647;
        mstSet[i] = 0;
    }

    key[0] = 0;
    parent[0] = -1;

    for (int count = 0; count < V - 1; count++)
    {
        int u = minKey(key, mstSet);

        mstSet[u] = 1;

        for (int v = 0; v < V; v++)
        {
            if (graph[u][v] && mstSet[v] == 0 && graph[u][v] < key[v])
            {
                parent[v] = u, key[v] = graph[u][v];
            }
        }
    }

    printMST(parent);
}

int main(void)
{
    freopen("input.txt", "r", stdin);
    int i, j, T;
    scanf("%d", &T);

    for (int test_case = 1; test_case <= T; test_case++)
    {
        printf("#%d ", test_case);
        scanf("%d", &V);

        for (i = 0; i < V; i++)
        {
            for (j = 0; j < V; j++)
            {
                scanf("%d", &graph[i][j]);
            }
        }

        primMST();
    }

    return 0;
}

'Algorithms > graphs' 카테고리의 다른 글

Maximum flow 알고리즘  (0) 2021.06.21
topological sorting 알고리즘  (0) 2021.06.21
Floyd-Warshall 알고리즘  (0) 2021.06.18
1263 사람 네트워크2 풀이중  (0) 2018.10.31

댓글