CS

[์ž๋ฃŒ๊ตฌ์กฐ] ๊ทธ๋ž˜ํ”„ (Graph)

moaoh 2024. 11. 7. 02:26

๊ทธ๋ž˜ํ”„ (Graph) ๋ž€?

  • ๊ทธ๋ž˜ํ”„๋Š” ์ •์ (vertex)๊ณผ ๊ฐ„์„ (edge)๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ

  • ํŠธ๋ฆฌ (Tree) ์™€ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋ƒ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,
    ๊ทธ๋ž˜ํ”„์— ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ ์ •์ ๋งˆ๋‹ค ๊ฐ„์„ ์ด ์—†์„ ์ˆ˜๋„ ์žˆ๊ณ  ๋ถ€๋ชจ ์ž์‹๊ฐœ๋…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋“ฑ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.
  • ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋“ฑ์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ sns์—์„œ๋Š” ๊ณตํ†ต๋œ ์นœ๊ตฌ๋ฅผ ์ฐพ๋Š” ๋“ฑ์— ํ™œ์šฉ๋œ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ 

  • ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Œ (์†Œ์…œ ๋„คํŠธ์›Œํฌ, ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋“ฑ)
  • ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ตœ๋‹จ ๊ฒฝ๋กœ, ์—ฐ๊ฒฐ์„ฑ ๋“ฑ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ.

๋‹จ์ 

  • ๊ตฌํ˜„๊ณผ ์—ฐ์‚ฐ์ด ๋ณต์žกํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํผ.
  • ์ˆœํ™˜์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.

๊ตฌํ˜„

<vector>๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„

#include <iostream>
#include <vector>

class Graph
{
private:
	int V;
	std::vector<std::vector<int> > adjMatrix;
public:
	Graph(const int& n) {
		this->V = n;
		adjMatrix.resize(V, std::vector<int>(V, 0));
	}
	~Graph() {};

	void addEdge(int u, int v) {
		adjMatrix[u][v] = 1; // ๋‹จ๋ฐฉํ–ฅ
	}

	void printGraph() {
		for (int i = 0; i < V; i++) {
			for (int j = 0; j < V; j++) {
				std::cout << adjMatrix[i][j] << " ";
			}
			std::cout << std::endl;
		}
	}
};

int main() {
    Graph g(5);  // 5๊ฐœ์˜ ์ •์ ์„ ๊ฐ€์ง„ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
    g.addEdge(0, 1);  // 0 -> 1
    g.addEdge(1, 2);  // 1 -> 2
    g.addEdge(2, 3);  // 2 -> 3
    g.addEdge(3, 4);  // 3 -> 4

    g.printGraph();
    return 0;
}
  • ๊ทธ๋ž˜ํ”„ (graph) ์— ๊ฒฝ์šฐ์—๋Š” ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (Directed Graph), ๋น„๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (Undirected Graph) ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๊ฒฝ์šฐ์—๋„ ํ™œ์šฉ๋œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

https://80000coding.oopy.io/125156cf-79bb-48da-82ae-1f2ee7896bb8

https://www.geeksforgeeks.org/applications-of-graph-data-structure/