2018-10-1 graph
그래프
- 정점(Node)와 간선(Edge)로 구성이 되어있다.
- 정점은 점이고 주로 번호가 써있다. 간선은 선이고 정점과의 관계가 표시되어있다(선의 방향)
- G = (V,E)로 나타낸다.
- 사이클은 시작=도착을 사이클이라고 한다.
단순경로와 단순 사이클
- 단순 : 같은 정점을 두번이상 방문하지 않는 경로/사이클
- 특별한 말이 없으면, 경로와 사이클은 단순경로/사이클을 의미한다.
- 방향이 없는 경우, 양방향 모두를 저장을 해서 표현을 한다.
간선 여러개, 루프의 경우도 있다.
가중치
- 가중치가 없는 경우 가중치를 1이라고 계산을 한다.
차수
- 들어가는 간선을 in-degree 나가는 간선을 out-degree라고 한다.
그래프 표현
- 정점은 갯수만 표시를 하면 된다.
- 간선은 방향을 설정을 해야되기때문에, 간선을 저장하는것이 그래프를 저장을 하는 것이다. 간선은 무엇과 무엇이 연결되어 있는지를 표현해야한다.
- 예를들어 정점(2)와 어떤 정점이 연결이 되었는지 표시를 해야한다.
그래프를 저장할때는 인접행렬과 인접리스트 2가지가 있다.
- 정점의 갯수가 V일때 VxV행렬로 표현을 할 수 있다.
- 인접행렬은 없는 간선도 저장을 하기때문에 잘 사용을 안한다.
- 그래프에 존재하지 않는 간선도 저장을 하기때문에 복잡한 그래프에는 잘 사용을 안한다.
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;
// 단방향 그래프
a[u][v]=1;
}
}
- 위의 그래프는 가중치가 없는(w=1)인 그래프의 표현이다.
- 가중치가 있는 경우는 a[i][j] w(가중치)가 들어간다.
- 만약의 가중치가 음수라면? 이 경우 간선이 없는 경우는 a[i][j]=-1을 저장을 한다.
- 가중치의 범위가 정수라면? 간선이 있으면 1, 없으면 0인 인접행렬을 만들고, 또 다른 인접행렬을 만들어서 간선이 있으면 가중치로 값을 둔다.
int a[10][10];
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i=0; i<m; i++) {
int u,v, w;
scanf("%d %d %d", &u, &v, &w);
// 양방향 그래프
a[u][v] a[v][u] = w;
// 단방향 그래프
a[u][v]=1;
}
}
Written on October 1, 2018