그래프란 정점들의 집합과 그 정점들을 연결하는 간선들의 집합을 가지는 자료구조이다. 그래프는 정점 사이의 관계를 표현할 수 있는 적합한 자료구조이다.
트리는 그래프의 한 종류이며, DAG(directed, Acyclic, Graph) 방향성이 존재하고, cycle이 없는, 비순환 그래프를 의미한다.
무방향 그래프 ( Undirected graph )
방향 그래프 ( Directed graph )
그래프의 구현은 크게 두 가지 방법으로 나눌 수 있다. 행렬을 이용한 구현과 리스트를 이용한 구현이다.
행렬에서 행과 열은 정점을 나타내고, 행렬값이 연결상태를 나타낸다. 0은 연결되어 있지 않음을의미하고, 1은 연결되어 있는 상태를 의미한다. 가중치 그래프라면 가중치가 입력된다. 무방향 그래프의 경우 행렬이 대칭으로 나타난다.
#include<iostream>
using namespace std;
const int SIZE = 1024;
int graph[SIZE][SIZE];
int main()
{
int start, end;
//int weight 가중치 그래프의 경우
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
cin >> start >> end;
//cin >> weight;
graph[start][end] = 1;
graph[end][start] = 1;
//graph[start][end] = weight;
}
}
}
보통 벡터를 리스트처럼 이용하여 그래프를 구현한다. 정점의 수 만큼 리스트를 생성하고 해당 리스트에 연결된 정점을 추가하는 방식으로 구현한다.
#include<iostream>
#include<vector>
using namespace std;
const int SIZE = 1024;
vector<int> graph[SIZE];
int main()
{
int start, end;
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
cin >> start >> end;
graph[start].push_back(end);
graph[end].push_back(start);
//가중치 그래프의 경우 vector<pair<int,int>> grpah[SIZE] 혹은 구조체를 이용한다.
}
}
}