๐๊ณต๋ถํ ๊ฑฐ List๐
- ์ข ๋ง๋ถ - ๊ทธ๋ํ์ ๊น์ด ์ฐ์ ํ์ (๊ฐ์ )
- ์ข ๋ง๋ถ - ๊ทธ๋ํ์ ๋๋น ์ฐ์ ํ์
- ์ข ๋ง๋ถ - ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ์ ๊น์ด ์ฐ์ ํ์ ์คํจ๋ ํธ๋ฆฌ (ํน์ DFS Spanning Tree)๋ฅผ ์์ฑํ๊ณ ๋๋ฉด ๊ทธ๋ํ์ ๊ฐ์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅํ ์ ์๋ค.
์คํจ๋ ํธ๋ฆฌ์ ํฌํจ๋ ๊ฐ์
์ ์กฐ์์ ์์์ผ๋ก ์ฐ๊ฒฐ๋์ง๋ง, ํธ๋ฆฌ ๊ฐ์ ์ด ์๋ ๊ฐ์ (์ค๊ฐ๋ ธ๋๋ฅผ ๊ฑฐ์น๋ ๋ค๋ฅธ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด ์๋จ)
์์์์ ์ ์กฐ๋ก ์ฐ๊ฒฐ๋๋ ๊ฐ์
์ ์กฐ์ ์์ ๊ด๊ณ๊ฐ ์๋ ์ ์ ๋ค ๊ฐ์ ์ฐ๊ฒฐ๋ ๊ฐ์
๋ฌดํฅ ๊ทธ๋ํ์์๋ ๊ต์ฐจ ๊ฐ์ ์ด ์๋ค. ๋ํ ์ญ๋ฐฉํฅ, ์๋ฐฉํฅ ๊ฐ์ ๋ ์๋ค.
dfs(u)๊ฐ dfs(v)๋ณด๋ค ์ผ์ฐ ์ข ๋ฃํ ๊ฒฝ์ฐ, u์์ v๋ก ๊ฐ๋ ๊ฐ์ ์ด ์กด์ฌํ ์ ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๋ฉด ๋๋ค.
์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ = ์ญ๋ฐฉํฅ ๊ฐ์ ์กด์ฌ ์ฌ๋ถ
discovered[]
: ๊ฐ ์ ์ ์ ๋ช ๋ฒ์งธ๋ก ๋ฐ๊ฒฌํ๋์ง ์ ์ฅ
dfs(u)์์ ๊ฐ์ (u,v)๋ฅผ ๊ฒ์ฌํ์ ๋,
-
v๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค. ๐
ํธ๋ฆฌ ๊ฐ์
-
v๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค.
- v๊ฐ u๋ณด๋ค ๋ฆ๊ฒ ๋ฐ๊ฒฌ๋์๋ค. (= v๊ฐ u์ ์์) ๐
์๋ฐฉํฅ ๊ฐ์
- v๊ฐ u๋ณด๋ค ์ผ์ฐ ๋ฐ๊ฒฌ๋์๋ค. (= v๋ u์ ์ ์กฐ) ๐
์ญ๋ฐฉํฅ ๊ฐ์
- dfs(v) ์ข
๋ฃ ํ, dfs(u) ์ข
๋ฃ ๐
๊ต์ฐจ ๊ฐ์
- dfs(v) ์ข
๋ฃ ํ, dfs(u) ์ข
๋ฃ ๐
- v๊ฐ u๋ณด๋ค ๋ฆ๊ฒ ๋ฐ๊ฒฌ๋์๋ค. (= v๊ฐ u์ ์์) ๐
discovered[i]
: i๋ฒ ์ ์ ์ ๋ฐ๊ฒฌ์์
finished[i]
: dfs(i)๊ฐ ์ข
๋ฃํ์ผ๋ฉด 1, ์๋๋ฉด 0
vector<vector<int>> adj;//์ธ์ ๋ฆฌ์คํธ
vector<int> discovered, finished;
int counter;//์ ์ญ๋ณ์
void dfs2(int here) {
discovered[here] = counter++;//๋ฐ๊ฒฌ์์
for(int i=0; i<adj[here].size(); ++i) { //here์ ์ธ์ ๋
ธ๋๋งํผ
int there = adj[here][i]; //๊ฐ ์ธ์ ๋
ธ๋๋ฅผ there๋ก ์ค์ ํ๊ณ
if(discovered[there] == -1) {//there๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๋ค๋ฉด
cout<<'tree edge'<<endl; //ํธ๋ฆฌ ๊ฐ์ ์ด๋ค
dfs2(there); //there ์ธ์ ๋
ธ๋์ ๋ํด dfs์งํ(์ฌ๊ทํธ์ถ)
}
//there์ ๋ฐ๊ฒฌ์์ ๊ฐ์ด ๋ ํฌ๋ฉด here -> there์์์ด๋ฏ๋ก ์๋ฐฉํฅ ๊ฐ์ ์ด๋ค
else if(discovered[here] < discovered[there]) cout<<"forwared edge"<<endl;
//here์ ๋ฐ๊ฒฌ์์ ๊ฐ์ด ๋ ํฌ๊ณ , dfs(there)์ด ์ข
๋ฃํ์ง ์์๋ค๋ฉด ์ญ๋ฐฉํฅ ๊ฐ์ ์ด๋ค
else if(finished[there] == 0) cout<<"back edge"<<endl;
//๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ ๋ชจ๋ ๊ต์ฐจ ๊ฐ์ ์ด๋ค
else cout<<"cross edge"<<endl;
}
finished[here] = 1; //dfs์ข
๋ฃ ์,finished ๊ฐ ์ฌ์ค์
}
์ด ์ ๊ณผ ์ธ์ ํ ๊ฐ์ ๋ค์ ๋ชจ๋ ์ง์ ์ ๋, ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ ์ด์์ผ๋ก ๋๋ ์ง๋ ์ ์
ํด๋น ์ ์ ์ ๊ทธ๋ํ์์ ์ญ์ ํ ์ปดํฌ๋ํธ ๊ฐ์๊ฐ ๋์ด๋ฌ๋์ง ํ์ธ ๐ ๋นํจ์จ์ ์
- DFS ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ๋ฌดํฅ ๊ทธ๋ํ์๋ ๊ต์ฐจ๊ฐ์ ์กด์ฌ x, ์ฆ ์ด๋ค ์ ์ u์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ๋ชจ๋ u์ ์ ์กฐ ํน์ ์์์ด๋ค.
- ์ด๋ค ์ ์ u๋ฅผ ์ญ์ ํ์ ๋, ์ปดํฌ๋ํธ ์๊ฐ ๋์ด๋์ง ์๋ ๊ฒฝ์ฐ๋ u์ ์ ์กฐ/์์์ด ๋ชจ๋ ์ญ๋ฐฉํฅ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ ๋ ๋ฟ์ด๋ค.
- ํน์ ์ด๋ค ์ ์ u๊ฐ ๋ฃจํธ์ด๊ณ u์ ์์์ด 1์ดํ์ธ ๊ฒฝ์ฐ์๋ ๊ทธ๋ํ๊ฐ ์ชผ๊ฐ์ง์ง ์๋๋ค. (๊ทธ๋ฅ ํ๋ผ๋น ์์ด์ ธ๋ฒ๋ฆฌ๊ธฐ๋๋ฌธ)
๋ฌดํฅ ๊ทธ๋ํ์์ ์ ๋จ์ ์ ํฌํจํ์ง ์๋ ์๋ธ๊ทธ๋ํ
ํ ๋ฒ์ ๊น์ด์ฐ์ ํ์์ผ๋ก ๋ชจ๋ ์ ๋จ์ ์ ์ถ๋ ฅํ๋ ํจ์์ ๊ตฌํ
findCutVertex()
: ๋งค๊ฐ๋ณ์ here
๋ฅผ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ์ ์๋ ์ ๋จ์ ์ ์ฐพ๋ ํจ์
vector<vector<int>> adj;
vector<int> discovered; //๊ฐ ์ ์ ์ ๋ฐ๊ฒฌ์์, -1๋ก ์ด๊ธฐํ
vector<bool> isCutVertex; //๊ฐ ์ ์ ์ ์ ๋จ์ ์ฌ๋ถ๋ฅผ ์ ์ฅ, false๋ก ์ด๊ธฐํ
int counter = 0;//๋ฐ๊ฒฌ์์ ์ ์ฅํ๋ ๋ณ์
int findCutVertex(int here, bool isRoot) {
discovered[here] = counter++;//๋ฐ๊ฒฌ์์ ๊ฐ ๊ฐฑ์
//ret : ํด๋น ์๋ธํธ๋ฆฌ์์ ์ญ๋ฐฉํฅ ๊ฐ์ ์ผ๋ก ๊ฐ ์ ์๋ ์ ์ ์ค ๊ฐ์ฅ ์ผ์ฐ ๋ฐ๊ฒฌ๋ ์ ์ ์ ๋ฐ๊ฒฌ์์
int ret = discovered[here];//ret์ ํ์ฌ ๋
ธ๋์ ๋ฐ๊ฒฌ์์๋ฅผ ์ ์ฅํ๊ณ
int children = 0;//์์ ์๋ธํธ๋ฆฌ์ ๊ฐ์(๋ฃจํธ์ธ ๊ฒฝ์ฐ, ์์์ด 2์ด์์ด์ด์ผ ํจ)
for(int i=0; i<adj[here].size(); ++i) {//์ธ์ ๋
ธ๋์ ๋ํด
int there = adj[here][i];//๊ฐ ์ธ์ ๋
ธ๋๋ฅผ there์ด๋ผ ์ ์ฅํ๊ณ
if(discovered[there] == -1) {//there ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด
++children;//์ผ๋จ here์ ์์๋
ธ๋ 1๊ฐ ์ถ๊ฐํด์ฃผ๊ณ ~
//์ฌ๊ทํธ์ถ๋ก ์์๋
ธ๋ there์ด ๋ฃจํธ์ธ ์๋ธํธ๋ฆฌ์ ์ ๋จ์ ์ ์ฐพ๋๋ค.
int subtree = findCutVertex(there, false);
//here๊ฐ ๋ฃจํธ๊ฐ ์๋๋ฉด์ there์๋ธํธ๋ฆฌ์ ์ ๋จ์ ๊ฐ์๊ฐ there์ ๋ฐ๊ฒฌ ์์์ด์์ด๋ฉด,
//์ฆ, ๊ทธ ๋
ธ๋๊ฐ ์๊ธฐ ์์ ์ดํ์ ์๋ค๋ฉด ํ์ฌ ์์น๋ ์ ๋จ์
if(!isRoot && subtree >= discovered[there])
isCutVertex[here] = true;
ret = min(ret, subtree);
}
else
ret = min(ret, discovered[there]);
}
if(isRoot) //๋ฃจํธ์ธ ๊ฒฝ์ฐ ์์์ด 2์ด์์ด๋ฉด ์ ๋จ์ ์ฌ๋ถ์ true
isCutVertex[here] = (children >= 2);
return ret;
}
์ด๋ค ๊ฐ์ ์ ์ญ์ ํ์ ๋, ์ด ๊ฐ์ ์ ํฌํจํ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ๋ก ์ชผ๊ฐ์ง๋ ๊ฒฝ์ฐ, ๊ทธ ๊ฐ์ ์ **๋ค๋ฆฌ(bridge)**๋ผ๊ณ ํ๋ค.
- bridge๋ ํญ์ Tree Edge์ด๋ค.
- (u, v) ๊ฐ์ ์ ์ ์ธํ๊ณ , u๋ณด๋ค ๋์ ์ ์ ๐ฆ์ ๊ฐ ์ ์๋ ์ญ๋ฐฉํฅ ๊ฐ์ ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, (u, v)๋ bridge์ด๋ค.
- ์ญ๋ฐฉํฅ ๊ฐ์ ์ค ์์ ์ ๋ถ๋ชจ๋ก ๊ฐ๋ ๊ฐ์ ์ ๋ฌด์ํ ๋ค, v์ ๊ทธ ์์๋ค์์ ์ญ๋ฐฉํฅ ๊ฐ์ ์ผ๋ก ๋ฟ์ ์ ์๋ ์ ์ ์ ์ต์ ๋ฐ๊ฒฌ ์์๊ฐ u ์ดํ๋ผ๋ฉด (u, v)๋ bridge์ด๋ค.๐ฆ
-
์ด์ค ๊ฒฐํฉ ์ปดํฌ๋ํธ์ ๋น์ทํ์ง๋ง, ๋ฐฉํฅ ๊ทธ๋ํ์์ ์ ์๋๋ ๊ฐ๋ ์ด๋ค.
-
๋ฐฉํฅ ๊ทธ๋ํ์์ u์ v์ ๋ํด ์๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์์ ๋ ๋ ์ ์ ์ ๊ฐ์ SCC์ ์ํด์๋ค๊ณ ํ๋ค.
-
๊ทธ๋ํ์์ ๊ฐ SCC ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ๋ค์ ๋ชจ์ผ๋ฉด SCC๋ค์ ์ ์ ์ผ๋ก ํ๋ DAG(Directed Acylic Graph_์ฌ์ดํด ์๋ ๋ฐฉํฅ ๊ทธ๋ํ)๋ฅผ ๋ง๋ค ์ ์๋ค.
-
๊ทธ๋ํ์ ์์ถ(Condensation) : ๊ทธ๋ํ์ ์ ์ ๋ค์ SCC๋ณ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ SCC๋ฅผ ํํํ๋ ์ ์ ๋ค์ ๋บ๋ ์๋ก์ด ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ๊ณผ์
-
๊ทธ๋ํ๊ฐ ๋ ๊ฐ ์ด์์ SCC๋ก ๋๋ ์ง๋ฉด, ํ ์ง์ ์์ ๋ค๋ฅธ ์ง์ ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ์๋ฏธ.
- ํ ๋ฒ์ ๊น์ด ์ฐ์ ํ์์ผ๋ก ๊ฐ ์ ์ ์ SCC๋ณ๋ก ๋ถ๋ฆฌํ๋ค.
- DFS ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ์ด ๋, ๊น์ด ์ฐ์ ํ์์ ์ํํ๋ฉด์ ๊ฐ ์ ์ ์ SCC๋ก ๋ฌถ๋๋ค.
์ SCC๊ฐ ์๊ฒจ๋๋ ์์ ์ ํญ์ scc()ํจ์๊ฐ ์ข ๋ฃํ๊ธฐ ์ง์ ์ด๋ค.
๊ทธ๋์ ๊ฐ SCC๋ ์์์ ๋ ฌ์ ์ญ์์ผ๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๋ค. (= ์ข ๋ฃํ ๋ ๋ง๋ค ์ ์ฅ๋ SCC์์๋ฅผ ๋ค์ง์ผ๋ฉด ์์์ ๋ ฌ ๊ฒฐ๊ณผ์ด๋ค.)
๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ์ง๋ฐฐํ๋ ์ ์ ์ ๋ถ๋ถ์งํฉ์ ๋งํ๋ฉฐ, ์ด ๋ ๊ฐ ์ ์ ์ด ์๊ธฐ ์์ ๊ณผ ๋ชจ๋ ์ธ์ ํ ์ ์ ๋ค์ ์ง๋ฐฐํ๋ค๊ณ ๊ฐ์ ํ๋ค.
ํธ๋ฆฌ์ ์ต์ ์ง๋ฐฐ ์งํฉ์ ์ฐพ๋ ๋ฐฉ๋ฒ
ํธ๋ฆฌ์ ๋งจ ์๋์๋ถํฐ ์์ํด์ ์๋ก ์ฌ๋ผ์ค๋ฉด์ ๊ฐ ๋ ธ๋์ ์ ํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ์ ๋ ธ๋๋ ์ ํํ์ง ์๋๋ค.(์์ ๊ณผ ๋ถ๋ชจ๋ ธ๋๋ง ์ง๋ฐฐํ ์ ์๊ธฐ ๋๋ฌธ)
- ์ด ์ธ ๋
ธ๋๋ ๋ค์์ ์กฐ๊ฑด ๋ง์กฑ์ฌ๋ถ์ ๋ฐ๋ผ ๋
ธ๋๋ฅผ ์ ํํ ์ง, ์ ํํ์ง ์์์ง ๊ฒฐ์ ํ๋ค.
- ์์ ์ค ์์ง ์ง๋ฐฐ๋นํ์ง ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด, ์ ํ
- ์๋ค๋ฉด, ์ ํํ์ง ์๋๋ค.
์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๊ทธ๋ํ๋ ๋ ธ๋ ๊ฐ์ ์ํ๊ด๊ณ๊ฐ ์์ ๋ฟ, ํธ๋ฆฌ์ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋๋ฐ ์ด๋ฅผ ๋ฃจํธ ์๋ ํธ๋ฆฌ๋ผ ํ๋ค.
๋ฃจํธ ์๋ ํธ๋ฆฌ์ ์์ฑ (์๋ก ๋์น๊ด๊ณ)
- ์ ํํ V-1๊ฐ์ ๊ฐ์ ์ด ์๋ค.
- ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋๋ค.
- ๋ ์ ์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋จ์ ๊ฒฝ๋ก๊ฐ ์ ํํ ํ๋ ์๋ค.
๋ฏธ์ ๊ด์ ๊ฐ์ ์นด๋ฉ๋ผ ์ค์นํ๋ ค๊ณ ํ๋ค. ํ ๊ฐค๋ฌ๋ฆฌ์ ๊ฐ์์นด๋ฉ๋ผ๋ฅผ ์ค์นํ๋ฉด ํด๋น ๊ฐค๋ฌ๋ฆฌ + ์ฐ๊ฒฐ๋ ๊ฐค๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ฐ์ํ ์ ์๋ค๊ณ ํ ๋, ๋ชจ๋ ๊ฐค๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ํ๊ธฐ ์ํด ํ์ํ ์ต์ ๊ฐ์ ์นด๋ฉ๋ผ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
โก๏ธkeypointโก๏ธ
dfs(here)
๋ here๋ฅผ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๋ฐํํ๋ฉด์- ํด๋น ๋
ธ๋๊ฐ ์ง๋ฐฐ ์งํฉ์ ์ผ๋ถ๋ก ์ ํ๋์๋์ง(=์์ ์ค ์์ง ์ง๋ฐฐ๋์ง ์์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ) ๐
INSTALLED
- ์๋๋ฉด ๋ค๋ฅธ ๋
ธ๋์ ์ง๋ฐฐ๋นํ๊ณ ์๋์ง ๐
WATCHED
- ํน์ ์ง๋ฐฐ๋นํ๊ณ ์์ง ์๋์ง๋ฅผ ๋ฐํ ๐
UNWATCHED
- ํด๋น ๋
ธ๋๊ฐ ์ง๋ฐฐ ์งํฉ์ ์ผ๋ถ๋ก ์ ํ๋์๋์ง(=์์ ์ค ์์ง ์ง๋ฐฐ๋์ง ์์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ) ๐
int V; //๊ฐค๋ฌ๋ฆฌ ์
vector<int> adj[MAX_V]; //์ธ์ ํ๋ ฌ
vector<bool> visited; //๋ฐฉ๋ฌธ์ฌ๋ถ
const int UNWATCHED = 0;//๊ฐ์๋์ง ์์ ๊ฐค๋ฌ๋ฆฌ
const int WATCHED = 1;//๊ฐ์๋๋ ๊ฐค๋ฌ๋ฆฌ
const int INSTALLED = 2;//์ค์น๋ ์นด๋ฉ๋ผ
int installed;//ํ์ฌ๊น์ง ์ค์น๋ ์นด๋ฉ๋ผ ์
int dfs(int here) {
visited[here] = true;//๋ฐฉ๋ฌธ์ฌ๋ถ ์ฐธ์ผ๋ก ์ค์
int childeren[3] = {0,0,0};//์๋ธํธ๋ฆฌ์ UNWATCHED, WATCHED, INSTALLED ์ ๋ณด์ ์ฅ
for(int i=0; i<adj[here].size(); ++i) {//์์๋
ธ๋ ์๋งํผ
int there = adj[here][i];//๊ฐ ์ธ์ ๋
ธ๋๋ฅผ there๋ก ์ค์ ํ๊ณ
if(!visited[there]) //์์ง ๋ฐฉ๋ฌธ์ํ๋ค๋ฉด
++children[dfs(there)];//ํด๋น ๋
ธ๋์ children๋ฐฐ์ด ์ ๋ณด ๊ฐฑ์
}
if(children[UNWATCHED]) {//์์ง ๊ฐ์๋์ง ์์ ๊ฐค๋ฌ๋ฆฌ๊ฐ ์๋ค๋ฉด
++installed;//์นด๋ฉ๋ผ ์ค์นํด์ฃผ๊ณ
return INSTALLED;//์ค์น๋์๋ค๊ณ ์ฒดํฌ
}
if(children[INSTALLED])//์ค์น๋ ์นด๋ฉ๋ผ๊ฐ ์๋ค๋ฉด ๋ ์ค์นํ ํ์์๊ณ
return WATCHED;//๊ฐ์๋๋ ๊ฐค๋ฌ๋ฆฌ ์ ๋ฐํํ๊ณ
return UNWATCHED;//๊ทธ ์ธ์๋ ๊ฐ์๋์ง ์๋ ๊ฐค๋ฌ๋ฆฌ ์ ๋ฐํ
}
//๊ทธ๋ํ๋ฅผ ๊ฐ์ํ๋ ๋ฐ ํ์ํ ์นด๋ฉ๋ผ ์ต์ ์ ๋ฐํ
int installCamera() {
installed = 0;//ํ์ฌ๊น์ง ์ค์น๋ ์นด๋ฉ๋ผ ์
visited = vector<bool>(V, false);//์ด๊ธฐํ
for(int u=0; u<V; ++u) {//๊ฐค๋ฌ๋ฆฌ ์๋งํผ
//์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ u๊ฐ ์์ง ๊ฐ์๋์ง ์๋ ์ํ๋ผ๋ฉด
if(!visitied[u] && dfs(u) == UNWATCHED)
++installed;//์นด๋ฉ๋ผ ์ค์น
}
return installed;//์ด ๊ฐ์ ๋ฐํ
}
โฑTime Complexityโฑ
O(g+h)
์ฐธ์ด๋, ๊ฑฐ์ง์ด๋์ ๊ฒฐ์ ์ ์ฌ๋ฌ ๋ฒ ํด์ผํ๋ ๋ฌธ์ ๋ค์ ๋ถ๋ฆฐ ๊ฐ ๋ง์กฑ์ฑ ๋ฌธ์ (Boolean Satisfiability Problem) ํน์ SAT๋ก ํด๊ฒฐํ ์ ์๋ค.
๋ถ๋ฆฐ ๊ฐ ๋ณ์์ ์ฐธ ํํ์ ๊ฑฐ์ง ํํ๋ค๋ก ๊ตฌ์ฑ๋ ์์ด ์ฃผ์ด์ง ๋, ์ด ์์ ๊ฐ์ ์ฐธ์ผ๋ก ํ๋ ๋ณ์์ ์กฐํฉ์ด ์๋์ง ์ฐพ๋ ๊ฒ.
๋ ผ๋ฆฌ์์ ๋ ผ๋ฆฌ๊ณฑ ์ ๊ทํ์ผ๋ก ํํํ์ ๋ ๊ฐ ์ ์ ์ต๋ ๋ ๊ฐ์ ๋ณ์๋ง์ด ์กด์ฌํ๋ SAT๋ฌธ์
๊ทธ๋ํ๋ฅผ ์ด์ฉํด ๋คํญ ์๊ฐ์ ํด๊ฒฐํ ์ ์๋ค.
์์์ ์ ๊ฐ๊น์ด ์ ์ ๋ถํฐ ์์๋๋ก ๋ฐฉ๋ฌธํ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ชจ๋ ์ธ์ ์ ์ ๋ค์ ๊ฒ์ฌํ๋ค.
- ์ด ์ค ์ฒ์๋ณด๋ ์ ์ ์ ๋ฐ๊ฒฌํ๋ฉด ๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก ํ(queue)์ ์ ์ฅํด๋๋๋ค.
- ์ธ์ ํ ์ ์ ๋ค์ ๋ชจ๋ ๊ฒ์ฌํ๊ณ ๋์, ๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์์ ๋ค์ ์ ์ ์ ๊บผ๋ด์ ๋ฐฉ๋ฌธํ๋ค.
vector<vector<int>> adj;//์ธ์ ๋ฆฌ์คํธ
vector<int> bfs(int start) {
vector<bool> discovered(adj.size(), false);//๋ฐ๊ฒฌ์ฌ๋ถ ์ด๊ธฐํ
queue<int> q;//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก
vector<int> order;//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก
discovered[start] = true;//์์๋
ธ๋์ ๋ฐ๊ฒฌ์ฌ๋ถ: ์ฐธ
q.push(start);//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์ ์์๋
ธ๋ ์ถ๊ฐ
while(!q.empty()) {//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์ด ์๋ ํ
int here = q.front();//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์ ์ฒซ๋ฒ์จฐ
q.pop();//๋ฐฉ๋ฌธํ์ผ๋, ๋ชฉ๋ก์์๋ ์ ๊ฑฐ
order.push_back(here);//๋ฐฉ๋ฌธํ ๋ชฉ๋ก์๋ ์ถ๊ฐ
for(int i=0; i<adj[here].size(); ++i) {//์ธ์ ๋ชฉ๋ก์ ๋ํด
int there = adj[here][i];//ํ์ฌ ์ธ์ ๋ชฉ๋ก์ there๋ก ์ค์ ํ๊ณ
if(!discovered[there]) {//there์ ์์ง ๋ฐ๊ฒฌ์ํ์๋ค๋ฉด
q.push(there);//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ
discovered[there] = true;//๋ฐ๊ฒฌ์ฌ๋ถ๋ ์ฐธ์ผ๋ก ์ค์
}
}
}
return order;//๋ฐฉ๋ฌธํ ๋
ธ๋ ์์๋ชฉ๋ก์ ๋ฐํ
}
โฑTime Complexityโฑ
์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ๊ฒฝ์ฐ : O(|V|+|E|)
์ธ์ ํ๋ ฌ๋ก ๊ตฌํํ ๊ฒฝ์ฐ : O(|V|^2)
๋๋น ์ฐ์ ํ์์์ ์ ์ ์ ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ ๋ค๋ง์ ๋ชจ์ ํธ๋ฆฌ
์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ : ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ๊ธธ์ด๊ฐ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
-
์์์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ BFS Spanning Tree์์ ์ฐพ์ ์ ์๋ค.
-
BFS Spanning Tree์์ ๊ฐ ์ ์ ์ผ๋ก๋ถํฐ ํธ๋ฆฌ์ ๋ฃจํธ์ธ ์์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ค์ ๊ทธ๋ํ ์์์์ ์ต๋จ๊ฑฐ๋ฆฌ์ด๋ค.
bfs2()
: start
์์ ์์ํด ๊ทธ๋ํ๋ฅผ ๋๋น ์ฐ์ ํ์ํ๊ณ ์์์ ๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ์ ๋๋น ์ฐ์ ํ์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ณ์ฐ
distance[i]
: start๋ถํฐ i๊น์ง์ ๊ฑฐ๋ฆฌ
parent[i]
: ๋๋น ์ฐ์ ํ์ ์คํจ๋ ํธ๋ฆฌ์์ i์ ๋ถ๋ชจ์ ๋ฒํธ, ๋ฃจํธ๋ฉด ์๊ธฐ์์
void bfs2(int start, vector<int>& distance, vector<int>& parent) {
distance = vector<int>(adj.size(), -1);
parent = vector<int>(adj.size(), -1);
queue<int> q;
distance[start] = 0;
parent[start] = start;
q.push(start);
while(!q.empty()) {
int here = q.front();
q.pop();
for(int i=0; i<adj[here].size(); ++i) {
int there = adj[here][i];
if(distance[there] == -1) {
q.push(there);
distance[there] = distance[here] + 1;
parent[there] = here;
}
}
}
}
shortestPath()
: v๋ก๋ถํฐ ์์์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ๊ณ์ฐ
vector<int> shortestPath(int v, const vector<int>& parent) {
vector<int> path(1,v);//์ต๋จ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
while(parent[v] != v) {//๋ฃจํธ์ ๋๋ฌํ์ง ์๋ ํ
v = parent[v];//v๋ฅผ ๋ถ๋ชจ๋ก ์ค์ ํ๊ณ
path.push_back(v);//์ต๋จ๊ฒฝ๋ก์ ์ถ๊ฐํ๋ค
}
//์์์ ๋ถํฐ ๊ฒฝ๋ก๊ตฌํด์ผ๋๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ฃจํธ๊ฐ ๋์ ์ด ๋๋๋ก ๊ตฌํ์ผ๋ฏ๋ก ๋ค์ง์ด์ค๋ค.
reverse(path.begin(), path.end());
return path;//์ต๋จ๊ฒฝ๋ก ๋ฐํ
}
์ฐ์๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ์์๋ฅผ ๋ค์ง๋ ๊ฒ์ ๋ค์ง๊ธฐ ์ฐ์ฐ์ด๋ผ๊ณ ํ ๋, ์ค๋ณต์๋ ์ ์ ๋ฐฐ์ด์ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์ด์ฉํด ์ ๋ ฌํ๊ธฐ ์ํด ํ์ํ ์ต์ ์ฐ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
โก๏ธkeypointโก๏ธ
- ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์๋ตํ๊ณ ๋ถ๋ถ ๊ตฌ๊ฐ์ ๋ค์ง์ผ๋ฉด์ ๊ทธ๋ ๊ทธ๋ ๊ทธ๋ํ์ ๊ฐ์ ์ ๋ง๋ ๋ค.
- ์ ์ ํ๋ ์ ์์ ๋ฐฐ์ด์ ํฌํจํ๊ณ , distance[]๋ ์ ์์ ๋ฐฐ์ด์ ํค๋ก ๊ฐ๋ map์ผ๋ก ๋ฐ๊พธ์ด ๊ตฌํํ์๋ค.
perm
: ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ ์ ๋ฐฐ์ด
bfs()
: perm์ ์ ๋ ฌํ๊ธฐ ์ํด ํ์ํ ์ต์ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์๋ฅผ ๊ณ์ฐ
๐ฆ ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ๋ค์ง์ด ๋ณด๋ ๋ถ๋ถ ๋ค์ ๋ณด๊ธฐ ๐ฆ
int bfs(const vector<int>& perm) {
int n = perm.size();//์์ด์ ์ด๋ฃจ๋ ์ซ์๊ฐ์
vector<int> sorted = perm;//sorted_perm์ด ์ ๋ ฌ๋ ํํ
sort(sorted.begin(), sorted.end());//<algorithm>
queue<vector<int>> q; //์ ์ ์ ๋ฐฉ๋ฌธ ๋ชฉ๋ก
map<vector<int>, int> distance; //์์์ ๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ
distance[perm] = 0;//์์์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ 0
q.push(perm); //์์์ ์ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ์ถ๊ฐ
while(!q.empty()) {//๋ฐฉ๋ฌธํ ์ ์ ์ด ์๋ ํ
vector<int> here = q.front(); //์ด๋ฒ์ ๋ฐฉ๋ฌธํ ์ ์ (์์ด)
q.pop();//๋ฐฉ๋ฌธํ์ผ๋ ๋ฐฉ๋ฌธํ ๋ชฉ๋ก์์ ์ ๊ฑฐ
//ํ์ฌ ์์ด์ด ์ ๋ ฌ๋ sorted ์์ด๊ณผ ๊ฐ๋ค๋ฉด(=๋ต์ด๋ฏ๋ก) ์ต๋จ๊ฑฐ๋ฆฌ ๋ฐํ
if(here == sorted) return distance[here];
int cost = distance[here];//์๋๋ผ๋ฉด, ํ์ฌ๊น์ง ์ฐ์ฐ์ ์๋ฅผ cost์ ์ ์ฅํ๊ณ
//๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ๋ค์ง์ด ๋ณธ๋ค.
for(int i=0; i<n; ++i) {
for(int j=i+2; i<=n; ++j) {
reverse(here.begin()+i, here.begin()+j);
if(distance.count(here) == 0) {
distance[here] = cost + 1;
q.push(here);
}
reverse(here.begin()+i, here.begin()+j);
}
}
}
return -1;
}
- ์ซ์๋ค์ด ๋ฌ๋ผ๋ ์๋์ ์ธ ํฌ๊ธฐ๊ฐ ๊ฐ์ ๋ฐฐ์ด๋ค์ ๋ํ ๋ต์ ๊ฐ๋ค.
- ์ํ๊ณต๊ฐ์ด ์๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก,
์์ ์ ์ ์์ ๋ชฉํ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ == ๋ชฉํ ์ ์ ์์ ์์ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ
์ด๋ค. ์ฆ, ํ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฐ ๋๋ ์ฐ์ฐ์ ์๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์๋ ๋ฐฐ์ด๋ก ๋ง๋๋ ๋ฐ ๋๋ ์ฐ์ฐ์ ์์ ๊ฐ๋ค.
โก๏ธkeypointโก๏ธ
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ๋ค๋ฅธ ๋ชจ๋ ์ํ๊น์ง ๋๋ฌํ๋ ๋ฐ ํ์ํ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์๋ฅผ ๋๋น ์ฐ์ ํ์์ ์ด์ฉํด ๊ณ์ฐํด๋๋ค.
precalc()
: ๋ชจ๋ ์์ด์ ๋ํด ํ์ํ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์๋ฅผ ๊ณ์ฐ
solve()
: precalc()
์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด perm์ ์ ๋ ฌํ๋ ๋ฐ ํ์ํ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์๋ฅผ ๊ณ์ฐ
๐ฆ precal
: ์ด์ค for๋ฌธ ๋ถ๋ถ ๋ค์ ๋ณด๊ธฐ / solve
: fixed์ ์๋ฏธ๐ฆ
map<vector<int>,int> toSort; //ํ์ํ ๋ค์ง๊ธฐ ์ฐ์ฐ์ ์
//๋ชจ๋ ์์ด์ ๋ํด toSort[] ๊ณ์ฐ
void precalc(int n) {
vector<int> perm(n);
for(int i=0; i<n; ++i) perm[i] = i;
queue<vector<int>> q;//๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก
q.push(perm);//์ฐ์ฐ์ ์ ๊ตฌํ ์์ด์ ๋ฐฉ๋ฌธํ ์ ์ ๋ชฉ๋ก์ ์ถ๊ฐ
toSort[perm] = 0;//์ด๊ธฐ ๋ค์ง๊ธฐ ์ฐ์ฐ์ 0์ผ๋ก ์ค์
while(!q.empty()) {//๋ฐฉ๋ฌธํ ์ ์ (์์ด)์ด ์๋ ํ
vector<int> here = q.front();//ํ์ฌ ๋ฐฉ๋ฌธํ ์์ด์ here์ด๋ผ ์ค์
q.pop();//๋ฐฉ๋ฌธํ์ผ๋ ๋ชฉ๋ก์์ ์ ๊ฑฐ
int cost = toSort[here];//here์์์ ์ฐ์ฐ์ ์๋ฅผ cost์ ์ ์ฅํ๊ณ
for(int i=0; i<n; ++i) {
for(int j=i+2; j<=n; ++j) {
reverse(here.begin()+i, here.begin()+j);
if(toSort.count(here) == 0) {
toSort[here] = cost + 1; //์ฐ์ฐ์ ์ +1
q.push(here);
}
reverse(here.begin()+i, here.begin()+j);
}
}
}
}
int solve(const vector<int>& perm) {
int n = perm.size();
vector<int> fixed(n);
for(int i=0; i<n; ++i) {
int smaller = 0;
for(int j=0; j<n; ++j)
if(perm[j] < perm[i]) //๋ค์ ๊ฒ์ด ๋ ์๋ค๋ฉด
++smaller; //๋ค์ง๊ธฐ ์ฐ์ฐ ํ์ํ๋๊น ์ฐ์ฐ ์ +1
fixed[i] = smaller;//?
}
return toSort[fixed];//?
}
n๋ช ์ ๋ชจ๋ ์์ด๋ค์๊ฒ ๊ฐ์ ์(1๊ฐ ์ด์)์ ์ฅ๋๊ฐ์ ์ฃผ๋, m๋ช ์ ์์ฌ์์ด ์์ด๋ค์ ๋ค๋ฅธ ์์ด๋ค๋ณด๋ค ์ฅ๋๊ฐ์ ํ ๊ฐ ๋ ์ฃผ๋ ค ํ๋ค. ์ฅ๋๊ฐ์ ๊ฐ๋ฅํ ์ ๊ฒ ์ฌ๋ คํ ๋ ๊ตฌ์ ํ ์ต์ ์ฅ๋๊ฐ์ ์๋ฅผ ๊ณ์ฐ
โก๏ธkeypointโก๏ธ
- ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์ ์์ฐ์๋ฅผ ์ฐพ๋๋ค.
- n+m์ด์์ด์ด์ผ ํ๋ค.
- n์ผ๋ก ๋๋ ๋๋จธ์ง๊ฐ m์ด์ด์ผ ํ๋ค.
- ์ฅ๋๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฆฟ์ ๋ชฉ๋ก์ ํฌํจ๋ ์ซ์๋ค๋ก๋ง ๊ตฌ์ฑ์ด ๋์ด์ผ ํ๋ค.
- ์ต์ ์ฅ๋๊ฐ ์ c๋ฅผ ์์ด๋ค์ ์ด ์ธ์ ์ n์ ๋๋ ๋๋จธ์ง๋ฅผ ์ ์ ์ผ๋ก ํํํ ๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด ๋ณธ๋ค.
๊ทธ๋ํ์์ ์ฃผ์ด์ง ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ฐพ๋ ๋ฌธ์
๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ ์์์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ค์ ๊ฒฝ๋ก ๊ณ์ฐ์ ์ํด์๋ ๋ณ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ค์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ด๋ ์ฝ๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํด์ผ ํจ.
๐ BFS์์์ฒ๋ผ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๊ณผ์ ์์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ํจ์๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๊ฐ์ค์น์ ํฉ์ด ์์์ธ ์ฌ์ดํด์ด ๋ฑ์ฅํ๋ฉด ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์์ ๋ฌดํ๋๋ก ๋ฐ์ฐํ ์ ์๋ค.
์ฆ, ์์ ์ฌ์ดํด์ด ์๋ ๊ทธ๋ํ์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
๋จ์ผ ์์์ ์๊ณ ๋ฆฌ์ฆ : ํ๋์ ์์์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ
๋ชจ๋ ์ ์๊ณ ๋ฆฌ์ฆ : ๋ชจ๋ ์ ์ ์ ์์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ
์ต๋จ ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฉํฅ ๊ทธ๋ํ ๊ธฐ์ค.
๋ฐ๋ผ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์๋ ์๋ฐฉํฅ ๊ฐ์ ์ ๋ ๊ฐ์ ์ผ๋ฐฉํตํ ๊ฐ์ ์ผ๋ก ์ชผ๊ฐ์ ๋ฐฉํฅ๊ทธ๋ํ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
๐ก ์์ ๊ฐ์ ์ด ์๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์๋ ํญ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
๋จ์ผ ์์์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์์์ ์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ์ ์ ๋ค๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
-
BFS์ฒ๋ผ ์์์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ๋ค๋ถํฐ ๋ฐฉ๋ฌธํ๋ค.
-
์ฐ์ ์์ ํ๊ฐ ์ ์ฅํ๋ ์ ๋ณด
u
: ์ ์ ์ ๋ฒํธcost
: ์ง๊ธ๊น์ง ์ฐพ์๋ธ ํด๋น ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ (๊ธฐ์ค)
-
dist[]
: ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด -
์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ชจ๋ ์ธ์ ์ ์ ์ ๊ฒ์ฌํ๋ค.
adj[์ฐ๊ฒฐ๋ ์ ์ ๋ฒํธ, ๊ฐ์ ๊ฐ์ค์น]
: ์ธ์ ๋ฆฌ์คํธ
dist[v]
: v๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
pq[์ต๋จ๊ฑฐ๋ฆฌ, ์ ์ ๋ฒํธ]
: ๋ฐฉ๋ฌธํ ์ ์ ์ ์ ์ฅํ๊ณ ์ฐ์ ์์ ํ๋ ๊ฐ์ฅ ํฐ ์์๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฏ๋ก, ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ ์ผ ํฐ ์ ์ ์ด ์๋ก ์ค๋๋ก -
๋ถํธ๋ฅผ ๋ถ์ฌ์ค๋ค.
int V; //์ ์ ์ ๊ฐ์
vector<pair<int,int>> adj[MAX_V];
vector<int> dijkstra(int src) {
vector<int> dist(V, INF);
dist[src] = 0;
priority_queue<pair<int,int>> pq;
pq.push(make_pair(0,src));
while(!pq.empty()) {
int cost = -pq.top().first;//pq ์ต์๋จ ๋
ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ
int here = pq.top().second;//pq ์ต์๋จ ๋
ธ๋์ ๋ฒํธ
pq.pop();//ํด๋น ๋
ธ๋์ ๋ณด๋ ์ ๊ฑฐ
//here๊น์ง ์ค๋ cost๋ณด๋ค ์งง์ ๊ฒฝ๋ก๊ฐ ์ด๋ฏธ ๋ฐ๊ฒฌ๋์์ผ๋ฉด ๋ค์ ๋
ธ๋๋ก..
if(dist[here] < cost) continue;
for(int i=0; i<adj[here].size(); ++i) {//here ์ธ์ ๋
ธ๋์ ๋ํด
int there = adj[here][i].first;//์ธ์ ๋
ธ๋๋ฒํธ๋ฅผ there์ ์ ์ฅ
//here๊น์ง์ ์ต๋จ๊ฒฝ๋ก cost์ here์์ there๊น์ง์ ๊ฑฐ๋ฆฌ ํฉ์ nextDist๋ผ ํ ๋
int nextDist = cost + adj[here][i].second;
//๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด
if(dist[there] > nextDist) {
dist[there] = nextDist; //๊ฐฑ์
pq.push(make_pair(-nextDist, there));//์ฐ์ ์์ ํ์ ์ถ๊ฐ
}
}
}
return dist;//์ต๋จ๊ฑฐ๋ฆฌ ๋ฐํ
}