Algorithm/BOJ
[BOJ] ์ฌ์ดํด ๊ฒ์(20040)
vividswan
2022. 3. 14. 00:47
[๋ฐฑ์ค(BOJ)] 20040_์ฌ์ดํด ๊ฒ์ C++
๋ฌธ์ : BOJ_20040๋ฒ ์ฌ์ดํด ๊ฒ์
๋ฌธ์ ์ค๋ช
n ๊ฐ์ ๋
ธ๋๊ฐ ์ฃผ์ด์ง๊ณ , m ๊ฐ์ ์๋ฐฉํฅ ์ ์ด ์ฃผ์ด์ก์ ๋, ์ต์ด๋ก ์ฌ์ดํด์ด ์์ฑ๋๋ m ๋ฒ ์งธ๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์
๋๋ค.
๋ชจ๋ m์ ์ํํด๋ ์ฌ์ดํด์ด ์๊ธฐ์ง ์์๋ค๋ฉด, 0์ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
Solution
์ ๋์จ ํ์ธ๋
n์ด ์ต๋ 500,000์ด๋ฏ๋ก O(n) ๋ง์ ๋ต์ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
์ ๋์จ ํ์ธ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด์ด์ง๋ ๋ ์ ์ merge ํ๋ฉด์ ์งํํฉ๋๋ค.
merge ํ๊ธฐ ์ ์ ์ฃผ์ด์ง ๋ ์ ์ด ๊ฐ์ ์กฐ์์ด๋ผ๋ฉด, ๊ฐ์ ์กฐ์์ ๊ฐ๊ณ ์๋ ๋
ธ๋๋ผ๋ฆฌ ์ด์ด์ง๋ฏ๋ก ์ฌ์ดํด์ด ๋ฉ๋๋ค.
์ด๋์ m์ ์ถ๋ ฅํด ์ค์ผ ํฉ๋๋ค.
Description
- vector๋ฅผ ์ด์ฉํด n๊ณผ m์ ๊ฐ์ ๋ง๋ ๋ฐฐ์ด์ ๋์ ํ ๋นํ์ต๋๋ค.
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> parent;
vector<int> level;
int find(int u){
if(u==parent[u]) return u;
return parent[u] = find(parent[u]);
}
void merge(int u, int v)
{
u = find(u);
v = find(v);
if (u == v)
return;
if (level[u] > level[v]) swap(u, v);
parent[u] = v;
if (level[u] == level[v]) ++level[v];
}
int main(){
cin >> n >> m;
parent.resize(n+1);
level.resize(n+1);
for(int i=1;i <=n;i++){
parent[i]=i;
level[i]=1;
}
int swc = 0;
for(int i=1;i<=m;i++){
int st, ed;
cin >> st >> ed;
if(find(st) == find(ed)) {
swc=i;
break;
}
merge(st,ed);
}
cout << swc << '\n';
}