๐ ๋งํฌ
https://www.acmicpc.net/problem/21924
๐คฏ ํ์ค ํ๊ธฐ
ํ์ค ํ๊ธฐ : ์ด๋ฆ ๋ถํฐ mst ๋ง์์ด ํธํด์ง๋ค.
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
์ต์ ์คํจ๋ ํธ๋ฆฌ(MST) ๋ฌธ์ ์ด๋ค.
์ถ๊ฐ๋ ๋ฌธ์ ์ ๋ ์๊ธธ๋ ์ด๋ฆ์ด ๋ญ๊ฐ MST ๊ฐ์์ ๋ค์ด๊ฐ๋ดค๋๋ ์ญ์ MST ์๋ค.
๊ฑด๋ฌผ์ ๋ชจ๋ ์ฐ๊ฒฐํ๋ ๋๋ก๋ฅผ ์ ํํด์ผ ํ๋ฏ๋ก ๋ฐ๋ก MST ๋ผ๋ ๊ฑธ ์ ์ ์๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ๊ตฌํํ์๋ค.
๋จ, ๋ชจ๋ ๋์๊ฐ ์ฐ๊ฒฐ ๋์ง ์์ผ๋ฉด -1์ ์ถ๋ ฅํด์ผํ๋๋ฐ, ์์ 3์์ ์์ ์๋ค ์ถ์ด
๋ชจ๋ ๋์๊ฐ ์ฐ๊ฒฐ๋์ง ์๋๋ค๋ ๊ฑด ๊ทธ๋ํ์ ์ฐ๊ฒฐ์์์ ๊ฐ์๊ฐ 1๊ฐ๋ณด๋ค ๋ง๋ค๋ ์ด์ผ๊ธฐ๋ค.
๋ฐ๋ผ์ ๋จผ์ ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด dfs ํ์์ ์งํํ์๋ค.
dfs ๋ฅผ 1๋ฒ ๊ฑด๋ฌผ์์ ์์ํ์ฌ ํ์ํ ํ, ๋ฐฉ๋ฌธํ์ง ์์ ๊ฑด๋ฌผ์ด ์๋ค๋ฉด ๋ชจ๋ ๋์๊ฐ ์ฐ๊ฒฐ ๋ ์ ์๋ ๊ฒ์ผ๋ก ํ๋จํ๋ค.
dfs ํ์ ํ ๋ชจ๋ ๊ฑด๋ฌผ์ด ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ๋ค๋ฉด, ๋ฐ๋ก ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ MST๋ฅผ ๊ตฌํด์ค๋ค.
MST๋ฅผ ๊ตฌํ ํ, ์ต์ข ์ ์ผ๋ก ๋ชจ๋ ๊ฐ์ Cost - MST Cost ๋ฅผ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
์ฃผ์ ํ ์ ์ Cost๊ฐ 10^6๊น์ง ์ฃผ์ด์ง๋ฏ๋ก long long type์ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ธ MST ๋ฌธ์ ๊ฐ๋ค.
๐ป ์ฝ๋
//AC
//BOJ 21924 ๋์ ๊ฑด์ค
#include <iostream>
#include <vector>
#include <algorithm>
#define SIZE 101010
using namespace std;
typedef long long ll;
int parent[SIZE];
bool visit[SIZE];
vector<int> graph[SIZE];
struct Edge{
int from, to, cost;
bool operator < (const Edge& other) const{
return cost < other.cost;
}
};
int Find(int x){
if(parent[x] == x) return x;
return parent[x] = Find(parent[x]);
}
void Union(int x, int y){
x = Find(x);
y = Find(y);
if(y < x) parent[y] = parent[x];
else parent[x] = parent[y];
}
void dfs(int x){
visit[x] = true;
for(int i=0; i<graph[x].size(); i++){
if(!visit[graph[x][i]]){
dfs(graph[x][i]);
}
}
}
int main(){
int N, M;
int from, to, cost;
ll costSum = 0, mstSum=0;
cin >> N >> M;
vector<Edge> node(M);
for(int i=0; i<M; i++){
cin >> node[i].from >> node[i].to >> node[i].cost;
costSum += node[i].cost;
graph[node[i].from].push_back(node[i].to);
graph[node[i].to].push_back(node[i].from);
}
dfs(1);
for(int i=1; i<=N; i++){
parent[i] = i;
if(!visit[i]){
printf("-1");
return 0;
}
}
sort(node.begin(), node.end());
for(int i=0; i<M; i++){
if(Find(node[i].from) != Find(node[i].to)){
mstSum += node[i].cost;
Union(Find(node[i].from), Find(node[i].to));
}
}
ll ans = costSum - mstSum;
printf("%lld", ans);
return 0;
}
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/16118] ๋ฌ๋น ์ฌ์ฐ, c++ (0) | 2021.07.25 |
---|---|
[BOJ/20136] ๋ฉํฐํญ ์ค์ผ์ค๋ง 2 (0) | 2021.06.26 |
[BOJ/2023] ์ ๊ธฐํ ์์, c++ (1) | 2021.06.08 |
[BOJ/21921] ๋ธ๋ก๊ทธ , c++ (0) | 2021.06.08 |
[BOJ/9202] Boggle, c++ (1) | 2021.06.04 |