๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ STL์์ ๋ฐ๋ก ์ ๊ณตํ์ง ์์ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
๊ตฌํ ๋ฐฉ์์ผ๋ก๋ ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๋ ๊ฐ์ง๊ฐ ์๋ค.
์ธ์ ํ๋ ฌ
์ผ๋ฐฉํฅ ๊ทธ๋ํ
์ฒซ ๋ฒ์งธ ํ์ธ 1๋ฒ ๋ ธ๋๋ 2๋ฒ, 3๋ฒ, 4๋ฒ ๋ ธ๋๋ก ์ด์ด์ง๋ค. ๋ ๋ฒ์งธ ํ์ธ 2๋ฒ ๋ ธ๋๋ 3๋ฒ ๋ ธ๋๋ง ์ด์ด์ง๋ค. ์ฆ, ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ์ด์ด์ง๋ ๊ฐ์ ์ด ์์ ๋ 1, ์์๋ 0์ผ๋ก ํํํ๋ค. ์ด๋ฅผ ํ๋ ฌ๋ก ํํํ๋ฉด ์ค๋ฅธ์ชฝ ํ์ ๊ฐ๋ค.
๋ฌด๋ฐฉํฅ(์๋ฐฉํฅ) ๊ทธ๋ํ
๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ ์๋ฐฉํฅ ๊ทธ๋ํ๋ก ๋ณผ ์ ์๋ค. ํํ์ ์ผ๋ฐฉํฅ ๊ทธ๋ํ์ ๋น์ทํ๋ค. 1๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ 2, 3, 4๋ฒ ๋ ธ๋๋ฅผ 1๋ก ํํํ๋ค. 2๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ 1, 3๋ฒ ๋ ธ๋๋ฅผ 1๋ก ํํํ๋ค. ์ด๋ ๊ฒ ํํํ ํ๋ ฌ์ ์ค๋ฅธ์ชฝ ํ์ ๊ฐ๋ค. ํ๋ ฌ์ ๋ณด๋ฉด ๋๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋์นญ์ด ๋จ์ ์์ ์๋๋ฐ, ๋ฌด๋ฐฉํฅ(์๋ฐฉํฅ)๊ทธ๋ํ์์๋ง ๋ํ๋๋ ํน์ง์ด๋ค.
์ธ์ ๋ฆฌ์คํธ
์ผ๋ฐฉํฅ ๊ทธ๋ํ
์ธ์ ํ๋ ฌ๊ณผ ๋น์ทํ๋ค. ์ฐ๊ฒฐ์ด ์์ผ๋ฉด ๊ณต๊ฐ ํ ๋น์ด ์์ ์๋๋ค.0 or 1 ๋ก ํํํ๋ ๊ฒ์ด ์๋ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์์ฒด๋ฅผ ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํํํ ๋ฆฌ์คํธ๋ ์ค๋ฅธ์ชฝ ํ์ ๊ฐ๋ค.
๋ฌด๋ฐฉํฅ(์๋ฐฉํฅ) ๊ทธ๋ํ
๋ฌด๋ฐฉํฅ(์๋ฐฉํฅ)๋ ์ธ์ ํ๋ ฌ๊ณผ ๋น์ทํ๋ค. ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค์ด ์ ๋ถ ํ ๋น๋๋ค ์ด๋ ๊ฒ ํํํ ๋ฆฌ์คํธ๋ ์ค๋ฅธ์ชฝ ํ์ ๊ฐ๋ค. ์ธ์ ํ๋ ฌ๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ ๋ค ํ ํน์ง์ด ๋์ ๋ณด์ด์ง ์๋๋ค.
์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๋น๊ต
์ธ์ ํ๋ ฌ
์ธ์ ํ๋ ฌ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์๋์ ์ผ๋ก ์ข์ง ์๋ค. ๊ฐ์ ์ ์ ๋ฌด๋ฅผ 0 or 1 ๋ก ํํํ๊ธฐ ๋๋ฌธ์ Nยฒ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํญ์ ํ ๋น๋์ด์ผ ํ๋ค. ํ์ง๋ง, ํ์ ์๋๋ ๋น ๋ฅด๋ค. ๋ฐฐ์ด๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ํตํ ํ์์ O(1)์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์ธ์ ๋ฆฌ์คํธ
์ธ์ ๋ฆฌ์คํธ๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์๋์ ์ผ๋ก ์ข๋ค. ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์๋ค๋ฉด ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง, ํ์ ์๋๋ ๋๋ฆฌ๋ค. ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฆฌ์คํธ๋ฅผ ์ํํด O(N)์ ํ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
ใ
ค | ์ธ์ ํ๋ ฌ | ์ธ์ ๋ฆฌ์คํธ |
๋ฉ๋ชจ๋ฆฌ ํจ์จ | ๋์จ | ์ข์ |
ํ์ ์๋ | ๋น ๋ฆ | ๋๋ฆผ |
ํํ ๋ฐฉ์ | ๊ฐ์ ์ ๋ฌด๋ฅผ 0 or 1 ๋ก ํํ | ๊ฐ์ ์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ฅผ ์ ์ฅ |
๊ทธ๋ํ๋ฅผ ๊ตฌํํด์ผ ํ ๋ ๊ตฌํ ์กฐ๊ฑด์ ์๋ง๋ ๋ฐฉ์์ ์ ํํ๋ค.
- ๊ฐ์ ์ด ์ ๋ค๋ฉด ์ธ์ ๋ฆฌ์คํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ ๋ฉด์์ ์ ๋ฆฌํ๋ค.
- ๊ฐ์ ์ด ๋ง๋ค๋ฉด ์ธ์ ํ๋ ฌ์ด ํ์ ์๋ ๋ฉด์์ ์ ๋ฆฌํ๋ค.
๊ตฌํ
์ธ์ ํ๋ ฌ
class Graph { private: vector<vector<int>> adj; int vNum; public: Graph(int vertex) { vNum = vertex; adj.resize(vNum, vector<int>(vNum, 0)); } void addEdge(int i, int j) { if (i >= 0 && i < vNum && j >= 0 && j < vNum) { adj[i][j] = 1; //adj[j][i] = 1; // ์๋ฐฉํฅ์ธ ๊ฒฝ์ฐ } } void removeEdge(int i, int j) { if (i >= 0 && i < vNum && j >= 0 && j < vNum) { adj[i][j] = 0; //adj[j][i] = 0; // ์๋ฐฉํฅ์ธ ๊ฒฝ์ฐ } } };
์ธ์ ๋ฆฌ์คํธ
class Graph { private: vector<list<int>> adj; int vNum; public: Graph(int vertex) { vNum = vertex; adj.resize(vertex); } void addEdge(int src, int dest) { if (src >= 0 && src < vNum && dest >= 0 && dest < vNum) { adj[src].push_back(dest); //adj[dest].push_back(src); // ์๋ฐฉํฅ์ธ ๊ฒฝ์ฐ } } void removeEdge(int src, int dest) { if (src >= 0 && src < vNum && dest >= 0 && dest < vNum) { adj[src].remove(dest); //adj[dest].remove(src); // ์๋ฐฉํฅ์ธ ๊ฒฝ์ฐ } } };
์๋ฐํ ๋ฐ์ง๋ฉด list๋ก ์ฌ์ฉํ๋๊ฒ ๋ง์ง๋ง, ์ค์ ๋ก ๊ตฌํํ ๋๋ std::vector๋ก ๊ตฌํํด๋ ๋ฌด๋ฐฉํ๋ค๊ณ ํ๋ค.
ํด์ ํ์ vector๋ก, ์ด์ list๋ก ๊ตฌํํ๋ค.
ย