diff --git "a/11-Kruskal&Prim/haeun/10423_\354\240\204\352\270\260\352\260\200 \353\266\200\354\241\261\355\225\264.cpp" "b/11-Kruskal&Prim/haeun/10423_\354\240\204\352\270\260\352\260\200 \353\266\200\354\241\261\355\225\264.cpp" new file mode 100644 index 0000000..8839460 --- /dev/null +++ "b/11-Kruskal&Prim/haeun/10423_\354\240\204\352\270\260\352\260\200 \353\266\200\354\241\261\355\225\264.cpp" @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#define MAX 1001 +using namespace std; + +int n, m, k; // 정점, 간선, 발전소의 개수 +int parent[MAX]; // 루트 노드를 저장하는 테이블 +bool elec[MAX]; // 발전소가 설치된 정점 표시 +vector>> edges; // 간선 정보 +int result = 0; // 최소 비용 + +int findParent(int x){ + // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀 호출 + if(x == parent[x]) return x; + return parent[x] = findParent(parent[x]); +} + +void unionParent(int cost, int a, int b){ + a = findParent(a); + b = findParent(b); + + // 두 정점 모두 발전소와 연결된 경우 + if(elec[a] && elec[b]) + return; + // 둘 중에 하나만 발전소와 연결된 경우 + else if(elec[a] && !elec[b]){ + // 발전소가 있는 지점에 연결 + parent[b] = a; + result += cost; + }else{ + parent[a] = b; + result += cost; + } +} + +void solution(){ + // 간선 비용에 따라 오름차순 정렬 + sort(edges.begin(), edges.end()); + + // 부모 테이블 초기화 + for(int i = 1; i <= n; i++){ + parent[i] = i; + } + + for(int i = 0; i < edges.size(); i++){ + int cost = edges[i].first; + int u = edges[i].second.first; + int v = edges[i].second.second; + + // 사이클을 형성하지 않으면서 + if(findParent(u) != findParent(v)){ + // 발전소에 연결되어 있지 않은 정점이 있으면 연결! + unionParent(cost, u, v); + } + } + + cout << result; // 최소 비용 출력 +} + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + + // 정점, 간선, 발전소의 개수 + cin >> n >> m >> k; + + // 발전소가 설치된 정점 표시하기 + for(int i = 0; i < k; i++){ + int idx; + cin >> idx; + elec[idx] = true; + } + + // 간선 정보 입력 + for(int i = 0; i < m; i++){ + int u, v, w; + cin >> u >> v >> w; + edges.push_back({w, {u, v}}); + } + + solution(); + + return 0; +} \ No newline at end of file diff --git "a/11-Kruskal&Prim/haeun/1197_\354\265\234\354\206\214 \354\212\244\355\214\250\353\213\235 \355\212\270\353\246\254.cpp" "b/11-Kruskal&Prim/haeun/1197_\354\265\234\354\206\214 \354\212\244\355\214\250\353\213\235 \355\212\270\353\246\254.cpp" new file mode 100644 index 0000000..7a2e9a6 --- /dev/null +++ "b/11-Kruskal&Prim/haeun/1197_\354\265\234\354\206\214 \354\212\244\355\214\250\353\213\235 \355\212\270\353\246\254.cpp" @@ -0,0 +1,66 @@ +#include +#include +#include +#include +using namespace std; + +int v, e; // 노드와 간선의 개수 (최대 10만개) +int parent[100001]; // 부모 테이블 초기화 +vector>> edges; // 모든 간선을 담을 배열 +int result = 0; + +// 특정 원소가 속한 집합 찾아내기 +int findParent(int x){ + // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀 호출 + if(x == parent[x]) return x; + return parent[x] = findParent(parent[x]); +} + +// 두 원소가 속한 집합을 합치기 +void unionParent(int a, int b){ + a = findParent(a); + b = findParent(b); + + // 더 작은 번호가 부모 노드가 되도록 + if(a < b) parent[b] = a; + else parent[a] = b; +} + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + + cin >> v >> e; + + // 부모 테이블 초기화 + for(int i = 1; i <= v; i++){ + parent[i] = i; + } + + // 모든 간선에 대한 정보 입력 받기 + for(int i = 0; i < e; i++){ + int a, b, cost; + cin >> a >> b >> cost; + edges.push_back({cost, {a, b}}); + } + + // 간선을 비용 순으로 정렬 + sort(edges.begin(), edges.end()); + + // 간선을 하나씩 확인하면서 + for(int i = 0; i < edges.size(); i++){ + int cost = edges[i].first; + int a = edges[i].second.first; + int b = edges[i].second.second; + + // 사이클이 발생하지 않는 경우에만 MST에 포함시키기 + if(findParent(a) != findParent(b)){ + unionParent(a, b); + result += cost; + } + } + + cout << result; + + return 0; +} \ No newline at end of file diff --git "a/11-Kruskal&Prim/haeun/1922_\353\204\244\355\212\270\354\233\214\355\201\254 \354\227\260\352\262\260.cpp" "b/11-Kruskal&Prim/haeun/1922_\353\204\244\355\212\270\354\233\214\355\201\254 \354\227\260\352\262\260.cpp" new file mode 100644 index 0000000..0711e8c --- /dev/null +++ "b/11-Kruskal&Prim/haeun/1922_\353\204\244\355\212\270\354\233\214\355\201\254 \354\227\260\352\262\260.cpp" @@ -0,0 +1,66 @@ +#include +#include +#include +#include +using namespace std; + +int v, e; // 노드와 간선의 개수 +int parent[1001]; // 부모 테이블 초기화 +vector>> edges; // 모든 간선을 담을 배열 +int result = 0; + +// 특정 원소가 속한 집합 찾아내기 +int findParent(int x){ + // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀 호출 + if(x == parent[x]) return x; + return parent[x] = findParent(parent[x]); +} + +// 두 원소가 속한 집합을 합치기 +void unionParent(int a, int b){ + a = findParent(a); + b = findParent(b); + + // 더 작은 번호가 부모 노드가 되도록 + if(a < b) parent[b] = a; + else parent[a] = b; +} + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + + cin >> v >> e; + + // 부모 테이블 초기화 + for(int i = 1; i <= v; i++){ + parent[i] = i; + } + + // 모든 간선에 대한 정보 입력 받기 + for(int i = 0; i < e; i++){ + int a, b, cost; + cin >> a >> b >> cost; + edges.push_back({cost, {a, b}}); + } + + // 간선을 비용 순으로 정렬 + sort(edges.begin(), edges.end()); + + // 간선을 하나씩 확인하면서 + for(int i = 0; i < edges.size(); i++){ + int cost = edges[i].first; + int a = edges[i].second.first; + int b = edges[i].second.second; + + // 사이클이 발생하지 않는 경우에만 MST에 포함시키기 + if(findParent(a) != findParent(b)){ + unionParent(a, b); + result += cost; + } + } + + cout << result; + + return 0; +} diff --git "a/11-Kruskal&Prim/haeun/4386_\353\263\204\354\236\220\353\246\254 \353\247\214\353\223\244\352\270\260.cpp" "b/11-Kruskal&Prim/haeun/4386_\353\263\204\354\236\220\353\246\254 \353\247\214\353\223\244\352\270\260.cpp" new file mode 100644 index 0000000..c2b3830 --- /dev/null +++ "b/11-Kruskal&Prim/haeun/4386_\353\263\204\354\236\220\353\246\254 \353\247\214\353\223\244\352\270\260.cpp" @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#define MAX 1001 +using namespace std; + +int n; // 별의 개수 +int parent[MAX]; // 루트 노드를 저장하는 테이블 +vector> coord; // 별의 좌표 +vector>> edges; // 정점 a와 b 사이의 거리 c +float result = 0; // 최소 비용 + +// 특정 원소가 속한 집합 찾아내기 +int findParent(int x){ + // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀 호출 + if(x == parent[x]) return x; + return parent[x] = findParent(parent[x]); +} + +// 두 원소가 속한 집합을 합치기 +void unionParent(int a, int b){ + a = findParent(a); + b = findParent(b); + + // 더 작은 번호가 부모 노드가 되도록 + if(a < b) parent[b] = a; + else parent[a] = b; +} + +int main(){ + ios_base::sync_with_stdio(0); + cin.tie(0); + + cin >> n; // 별의 개수 + + for(int i = 0; i < n; i++){ + parent[i] = i; // 부모 테이블 초기화 + } + + for(int i = 0; i < n; i++){ + float x, y; + cin >> x >> y; + coord.push_back({x, y}); // 별의 좌표 + } + + for(int i = 0; i < n; i++){ + float x1 = coord[i].first; + float y1 = coord[i].second; + + for(int j = i + 1; j < n; j++){ + float x2 = coord[j].first; + float y2 = coord[j].second; + + // 두 정점 사이의 거리 구하기 + float dist = sqrt(pow(x1-x2, 2) + pow(y1-y2, 2)); + edges.push_back({dist, {i, j}}); + } + } + + // 간선의 비용에 따라 오름차순 정렬 + sort(edges.begin(), edges.end()); + + for(int i = 0; i < edges.size(); i++){ + float cost = edges[i].first; + int a = edges[i].second.first; + int b = edges[i].second.second; + + if(findParent(a) != findParent(b)){ + unionParent(a, b); + result += cost; + } + } + + cout << result; + + return 0; +} \ No newline at end of file