그래프를 저장하는 방법에는 3가지 방법이 있다.
바로 인접행렬, 인접리스트, 간선리스트이다.
순서대로 각각 비교해 보도록 하겠다.
i) 인접 행렬
V*V 의 2차원 행렬을 만들어 처리하는 방법이다.
A[i][j] 에 대해 설명하면 i 에서 j로 가는 간선이 있으면 w(가중치) 의 값을 대입하고 없으면 0 을 대입한다.
그래프에서 가중치가 따로 나와있지 않는다면 1로 가정하고 처리하면 된다.
양방향 그래프라면 A[i][j]와 A[j][i]의 값이 같은값을 넣어야한다. 따라서 공간을 많이, 중복된 값을 차지한다는 점에서 자주 사용하는 방법은 아니다.
코트를 통해 간단하게 나타내면 아래와 같다.
#include <iostream>
#include <vector>
int a[10][10];
int main(){
int n, m;
scanf("%d %d", &n,&m);
for (int i=0;i<m;i++){
int u,v;
scanf("%d %d", &u,&v);
a[u][v] = a[v][u] = 1;
}
return 0;
}
ii) 인접 리스트
#include <iostream>
#include <vector>
using namespace std;
vector<int> a[10];
int main() {
int m,n;
scanf("%d %d", &n,&m);
for(int i=0; i<m; i++){
int u,v;
scanf("%d %d", &u,&v);
a[u].push_back(v);
}
}
※ 벡터를 사용할 때 주의해야 할 점
vector<int> a(10) 과 vector<int> a[10] 은 다르다는 것이다.
vector<int> a(10) 은 1차원 벡터를 의미하고 vector<int> a[10] 은 2차원 백터를 의미한다. 즉 a백터가 10개를 가지고 있다 라는 것이다.
따라서 헷갈리지 않게 작성하고 싶다면 1차원 벡터는 그대로 vector<int> a(10) 으로 작성하고
2차원 벡터는vector<vector<int> >a(10) 으로 작성하는것이 좋다.
iii) 간선 리스트
간선리스트에 대해서는 따로 설명하지 않겠다. 그 이유는 세가지 방법중 가장 잘 안쓰는 방법이기 때문이다. 이 간선 리스트를 사용할 때에는 아마 STL을 이용하지 못하는 상황에서만 사용한다.
'algorithm > [C++] BAEKJOON' 카테고리의 다른 글
algospot 조세푸스 문제 (문제 ID:JOSEPHUS, 난이도:하) (0) | 2018.07.25 |
---|---|
그래프 탐색방법 - BFS (0) | 2018.07.19 |
그래프 탐색방법 - DFS (0) | 2018.07.19 |