본문 바로가기
자료구조와 알고리즘/[Inflearn_rookiss] Part3: 자료구조와 알고리즘

1. 그래프 기초

by 헛둘이 2022. 9. 17.
그래프란?
  • 그래프는 현실 세계의 사물이나 추상적인 개념 간 연결 관계를 표현함
  • 정점 : 각각의 데이터를 표현
  • 간선 : 정점들을 연결하는 선
  • 그래프는 연결 개수에 제한이 없다. (연결리스트의 노드와 비교했을 때)
  • 도로, 소셜 네트워크 등 활용 범위가 무궁무진함

 

가중치 그래프란?
  • 연결관계 뿐만 아니라 가중치를 주어 이동 간 비용을 표시

 

방향 그래프란?
  • 말 그대로 방향이 있는 그래프다.
  • 두 사람 사이의 호감도 같은 것

 

 


그래프의 구현 방법 1
void CreateGraph_1()
{
	struct Vertex
	{
		vector<Vertex*> edges;
	};

	vector<Vertex> v;
	v.resize(6);

	v[0].edges.push_back(&v[1]);
	v[0].edges.push_back(&v[3]);
	v[1].edges.push_back(&v[0]);
	v[1].edges.push_back(&v[2]);
	v[1].edges.push_back(&v[3]);
	v[3].edges.push_back(&v[4]);
	v[5].edges.push_back(&v[4]);

	bool connected = false;

	for (Vertex* edge : v[0].edges)
	{
		if (edge == &v[3])
		{
			connected = true;
			break;
		}
	}
}
  • Vertex는 멤버로 Vertex 포인터의 배열(edge)을 가지고 있다.
  • v는 Vertex의 배열로 v의 인덱스에 접근해서 Vertex의 edge 안에 연결된 정점을 넣는다
  • 탐색할 때는 해당 인덱스의 Vertex가 가진 edge안에 찾고자 하는 정점이 있는지 비교한다.

 

 

 

 

 

 


그래프 구현 방법 2
void CreateGraph_2()
{
	struct Vertex
	{
	};

	vector<Vertex> v;
	v.resize(6);

	vector<vector<int>> adjacent(6);

	adjacent[0] = { 1, 3 };
	adjacent[1] = { 0, 2, 3 };
	adjacent[3] = { 4 };
	adjacent[5] = { 4 };

	bool connected = false;
	for (int vertex : adjacent[0])
	{
		if (vertex == 3)
		{
			connected = true;
			break;
		}
	}
}
  • int의 2차원 배열을 통해서 0번째에는 정점을 넣고 그 멤버로 연결된 정점의 목록을 넣는다.
  • 검색할 때는 해당 정점의 인덱스를 넣고 for문을 통해 찾을 수 있다.

 

 

 

 

 

 


그래프 구현 방법 3
void CreateGraph_3()
{
	struct Vertex
	{
	};

	vector<Vertex> v;
	v.resize(6);

	//연결된 목록 관리
	//[X][O][X][O][X][X]
	//[O][X][O][O][X][X]
	//[X][X][X][X][X][X]
	//[X][X][X][X][O][X]
	//[X][X][X][X][X][X]
	//[X][X][X][X][O][X]

	//메모리를 좀 더 많이 소모하더라도 빠르게 연결확인가능
	
	vector<vector<bool>> adjacent(6, vector<bool>(6, false));

	adjacent[0][1] = true;
	adjacent[0][3] = true;
	adjacent[1][0] = true;
	adjacent[1][2] = true;
	adjacent[1][3] = true;
	adjacent[3][4] = true;
	adjacent[5][4] = true;

	bool connected = false;
	if (adjacent[1][3])
		connected = true;


	vector<vector<int>> adjacent2(6, vector<int>(6, -1));

	adjacent2[0][1] = 15;
	adjacent2[0][3] = 35;
	adjacent2[1][0] = 15;
	adjacent2[1][2] = 5;
	adjacent2[1][3] = 10;
	adjacent2[3][4] = 5;
	adjacent2[5][4] = 5;


}
  • 메모리를 포기하고 성능을 선택하는 방법
  • 가능한 경우의 수에 대해 모든 메모리를 소비하지만
  • 해당 간선과 연결여부를 확인하는데 O(1) 시간이 소요된다.

댓글