알고리즘/문제 풀이

백준 1197 - 최소 스패닝 트리(C++)

qqlzzb 2022. 6. 29. 17:23

문제 https://www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

풀이

이전에 게시했던 MST 관련 포스팅을 익혔다면 그냥 해결할 수 있는 문제이다.

MST를 구현해서 가중치의 합을 출력하면 된다.

 

◎ MST를 구현하기 위한 알고리즘에 대한 설명은 -> https://qqs-diary.tistory.com/106

 

MST (Minimum Spanning Tree)

MST란 그래프의 모든 vertex를 최소 edge의 weight로 연결한 그래프이다. 최소 비용으로 모든 도시의 도로를 연결하거나, 통신망을 연결하는 데 응용할 수 있다. Kruskal's Algorithm MST를 찾아내는 알고리

qqs-diary.tistory.com

 MST 구현 코드는 -> https://qqs-diary.tistory.com/107

 

MST (Minimum Spanning Tree)

MST란 그래프의 모든 vertex를 최소 edge의 weight로 연결한 그래프이다. 최소 비용으로 모든 도시의 도로를 연결하거나, 통신망을 연결하는 데 응용할 수 있다. Kruskal's Algorithm MST를 찾아내는 알고리

qqs-diary.tistory.com

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int getparent(int cycle[], int x)
{
    if(cycle[x]==x) return x;
    return cycle[x]=getparent(cycle,cycle[x]);
}

void unionparent(int cycle[],int a, int b)
{
    a=getparent(cycle,a);
    b=getparent(cycle,b);
    if(a<b) cycle[b]=a;
    else cycle[a]=b;
}

int find(int cycle[], int a, int b)
{
    a=getparent(cycle,a);
    b=getparent(cycle,b);
    if(a==b) return 1;
    else return 0;
}

class Edge
{
public:
    int node[2];
    int weight;
    Edge(int a, int b, int weight)
    {
        this->node[0]=a;
        this->node[1]=b;
        this->weight=weight;
    }
    bool operator <(Edge &edge)
    {
        return this->weight < edge.weight;
    }
};

int main()
{
    int n,m;
    cin>>n>>m;
    vector<Edge> v;
    for(int i=0; i<m; i++)
    {
        int a,b,w;
        cin>>a>>b>>w;
        v.push_back(Edge(a,b,w));
    }
    sort(v.begin(),v.end());

    int *cycle = new int[n];
    for(int i=0;i<n; i++) cycle[i]=i;

    int sum=0;
    for(int i=0; i<v.size(); i++)
    {
        if(!find(cycle,v[i].node[0]-1,v[i].node[1]-1))
        {
            sum+=v[i].weight;
            unionparent(cycle,v[i].node[0]-1,v[i].node[1]-1);
        }
    }
    cout<<sum;
    delete []cycle;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

백준 5430 - AC(C++)  (0) 2022.07.11
백준 4358 - 생태학(C++)  (0) 2022.07.03
백준 2776 - 암기왕(C++)  (0) 2022.06.25
백준 8979 - 올림픽(C++)  (0) 2022.06.23
백준 1244 - 스위치 켜고 끄기(C++)  (0) 2022.06.21