문제 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 |