graph implementation c using adjacency list
이 튜토리얼은 C ++에서 그래프의 구현을 설명합니다. 또한 그래프의 다양한 유형, 표현 및 응용에 대해 학습합니다.
그래프는 비선형 데이터 구조입니다. 그래프는 두 개 이상의 정점을 연결하는 '정점'및 '가장자리'라고도하는 노드 모음으로 정의 할 수 있습니다.
그래프는 정점이 부모-자식 관계가 없지만 복잡한 관계를 유지하는 순환 트리로 볼 수도 있습니다.
usertesting에서 얼마를 벌 수 있습니까?
=> Absolute C ++ 교육 시리즈를 보려면 여기를 클릭하십시오.
학습 내용 :
C ++에서 그래프 란 무엇입니까?
위에서 언급했듯이 C ++의 그래프는 정점과 가장자리의 모음으로 정의 된 비선형 데이터 구조입니다.
다음은 그래프 데이터 구조의 예입니다.
위에 주어진 그래프 G의 예입니다. 그래프 G는 정점 세트 {A, B, C, D, E}와 모서리 세트 {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
그래프 유형 – 유 방향 및 무 방향 그래프
간선에 방향이없는 그래프를 무 방향 그래프라고합니다. 위에 표시된 그래프는 무 방향 그래프입니다.
간선에 방향이 연결된 그래프를 방향성 그래프라고합니다.
아래는 유 방향 그래프의 예입니다.
위에 표시된 유 방향 그래프에서 가장자리는 정렬 된 쌍을 형성하며 각 가장자리는 한 정점에서 다른 정점으로의 특정 경로를 나타냅니다. 경로가 시작되는 정점을 ' 초기 노드 ”경로가 끝나는 정점을“ 터미널 노드 ”.
따라서 위 그래프에서 꼭짓점 집합은 {A, B, C, D, E}이고 가장자리 집합은 {(A, B), (A, D), (B, C), (B, E)입니다. ), (D, E) (E, C)}.
그래프 용어 또는 아래 그래프와 관련하여 사용되는 일반적인 용어에 대해 설명합니다.
그래프 용어
- 꼭지점: 그래프의 각 노드를 정점이라고합니다. 위 그래프에서 A, B, C, D는 그래프의 꼭지점입니다.
- 가장자리: 두 정점 사이의 링크 또는 경로를 가장자리라고합니다. 두 개 이상의 정점을 연결합니다. 위 그래프의 다른 간선은 AB, BC, AD 및 DC입니다.
- 인접 노드 : 그래프에서 두 노드가 에지로 연결된 경우 인접 노드 또는 인접 노드라고합니다. 위의 그래프에서 꼭지점 A와 B는 모서리 AB로 연결되어 있습니다. 따라서 A와 B는 인접 노드입니다.
- 노드의 정도 : 특정 노드에 연결된 가장자리의 수를 노드의 정도라고합니다. 위의 그래프에서 노드 A의 차수는 2입니다.
- 통로: 그래프에서 한 정점에서 다른 정점으로 이동해야 할 때 따라야하는 노드 시퀀스를 경로라고합니다. 예제 그래프에서 노드 A에서 C로 이동해야하는 경우 경로는 A-> B-> C입니다.
- 닫힌 경로 : 초기 노드가 터미널 노드와 같으면 해당 경로를 닫힌 경로라고합니다.
- 간단한 경로 : 다른 모든 노드가 구별되는 닫힌 경로를 단순 경로라고합니다.
- 주기: 반복되는 가장자리 또는 정점이없고 첫 번째 및 마지막 정점이 동일한 경로를 순환이라고합니다. 위 그래프에서 A-> B-> C-> D-> A는주기입니다.
- 연결된 그래프 : 연결된 그래프는 각 정점 사이에 경로가있는 그래프입니다. 이것은 분리되거나 연결 모서리가없는 단일 정점이 없음을 의미합니다. 위에 표시된 그래프는 연결된 그래프입니다.
- 완전한 그래프 : 각 노드가 다른 노드에 연결되어있는 그래프를 완료 그래프라고합니다. N이 그래프의 총 노드 수이면 전체 그래프에는 N (N-1) / 2 개의 간선이 포함됩니다.
- 가중 그래프 : 길이 (가장자리로 연결된 정점 사이의 거리)를 나타내는 각 가장자리에 할당 된 양수 값을 가중치라고합니다. 가중 간선을 포함하는 그래프를 가중 그래프라고합니다. 에지 e의 가중치는 w (e)로 표시되며 에지를 횡단하는 비용을 나타냅니다.
- Diagraph : digraph는 모든 엣지가 특정 방향과 연관되고 순회가 지정된 방향으로 만 수행 될 수있는 그래프입니다.
그래프 표현
그래프 데이터 구조가 메모리에 저장되는 방식을 '표현'이라고합니다. 그래프는 순차적 표현 또는 링크 된 표현으로 저장할 수 있습니다.
이 두 유형은 아래에 설명되어 있습니다.
순차적 표현
그래프의 순차적 표현에서는 인접 행렬을 사용합니다. 인접 행렬은 n x n 크기의 행렬입니다. 여기서 n은 그래프의 꼭지점 수입니다.
인접 행렬의 행과 열은 그래프의 정점을 나타냅니다. 정점 사이에 가장자리가있을 때 행렬 요소는 1로 설정됩니다. 모서리가 없으면 요소가 0으로 설정됩니다.
다음은 인접 행렬을 보여주는 그래프의 예입니다.
위 그래프에 대한 인접 행렬을 보았습니다. 이것은 무 방향 그래프이기 때문에 에지가 양방향으로 존재한다고 말할 수 있습니다. 예를 들어 에지 AB가 존재하므로 에지 BA도 존재한다는 결론을 내릴 수 있습니다.
인접 행렬에서 가장자리가 존재할 때마다 1로 설정되고 가장자리가 없을 때 0으로 설정된 행렬 요소 인 정점의 상호 작용을 볼 수 있습니다.
이제 유 방향 그래프의 인접 행렬을 살펴 보겠습니다.
위에 표시된대로 인접 행렬의 교차 요소는 한 정점에서 다른 정점으로 향하는 가장자리가있는 경우에만 1이됩니다.
위의 그래프에서 우리는 꼭지점 A에서 두 개의 가장자리를 가지고 있습니다. 하나의 가장자리는 꼭지점 B로 끝나고 두 번째 가장자리는 꼭지점 C로 끝납니다. 따라서 인접 행렬에서 A와 B의 교차점은 A와 C의 교차점으로 1로 설정됩니다.
다음으로 가중 그래프에 대한 순차적 표현을 볼 것입니다.
아래에 가중 그래프와 해당 인접 행렬이 있습니다.
가중 그래프의 순차적 표현이 다른 유형의 그래프와 다르다는 것을 알 수 있습니다. 여기서 인접 행렬의 0이 아닌 값은 가장자리의 실제 가중치로 대체됩니다.
에지 AB의 가중치는 4이므로 인접 행렬에서 A와 B의 교차점을 4로 설정합니다. 마찬가지로 0이 아닌 다른 모든 값은 각각의 가중치로 변경됩니다.
인접 목록은 구현하고 따르기가 더 쉽습니다. 순회 즉, 한 정점에서 다른 정점으로의 가장자리가 있는지 확인하려면 O (1) 시간이 걸리고 가장자리를 제거하는데도 O (1)이 걸립니다.
그래프가 희소 (간선이 적음)이든 조밀하든 항상 더 많은 공간을 차지합니다.
연결된 표현
그래프의 링크 된 표현을 위해 인접 목록을 사용합니다. 인접 목록 표현은 그래프의 각 노드와이 노드에 인접한 노드에 대한 링크를 유지합니다. 모든 인접 노드를 탐색 할 때 목록 끝에서 다음 포인터를 null로 설정합니다.
먼저 무 방향 그래프와 인접 목록을 고려해 보겠습니다.
위와 같이 각 노드에 대한 연결 목록 (인접 목록)이 있습니다. 정점 A에서 정점 B, C 및 D에 대한 가장자리가 있습니다. 따라서 이러한 노드는 해당 인접 목록의 노드 A에 연결됩니다.
다음으로 유 방향 그래프에 대한 인접 목록을 생성합니다.
위의 방향 그래프에서 정점 E에서 시작된 모서리가 없음을 알 수 있습니다. 따라서 정점 E에 대한 인접 목록이 비어 있습니다.
이제 가중 그래프에 대한 인접 목록을 구성 해 보겠습니다.
가중치가 적용된 그래프의 경우, 위에 표시된대로 가장자리의 가중치를 표시하기 위해 인접 목록 노드에 추가 필드를 추가합니다.
인접 목록에 정점을 추가하는 것이 더 쉽습니다. 또한 연결 목록 구현으로 인해 공간을 절약합니다. 한 정점과 다른 정점 사이에 가장자리가 있는지 확인해야 할 때 작업이 효율적이지 않습니다.
그래프의 기본 작업
다음은 그래프 데이터 구조에서 수행 할 수있는 기본 작업입니다.
- 정점 추가 : 그래프에 정점을 추가합니다.
- 가장자리 추가 : 그래프의 두 꼭지점 사이에 가장자리를 추가합니다.
- 그래프 정점을 표시합니다. 그래프의 꼭지점을 표시합니다.
인접 목록을 사용한 C ++ 그래프 구현
이제 인접 목록을 사용하여 간단한 그래프를 보여주는 C ++ 구현을 제시합니다.
여기서는 가중 유향 그래프에 대한 인접 목록을 표시합니다. 그래프의 인접 목록과 모서리를 유지하기 위해 두 개의 구조를 사용했습니다. 인접 목록은 (start_vertex, end_vertex, weight)로 표시됩니다.
C ++ 프로그램은 다음과 같습니다.
#include using namespace std; // stores adjacency list items struct adjNode { int val, cost; adjNode* next; }; // structure to store edges struct graphEdge { int start_ver, end_ver, weight; }; class DiaGraph{ // insert new nodes into adjacency list from given graph adjNode* getAdjListNode(int value, int weight, adjNode* head) { adjNode* newNode = new adjNode; newNode->val = value; newNode->cost = weight; newNode->next = head; // point new node to current head return newNode; } int N; // number of nodes in the graph public: adjNode **head; //adjacency list as array of pointers // Constructor DiaGraph(graphEdge edges(), int n, int N) { // allocate new node head = new adjNode*(N)(); this->N = N; // initialize head pointer for all vertices for (int i = 0; i 산출:
산출:
그래프 인접 목록
YouTube에서 MP4 변환기 온라인 무료
(start_vertex, end_vertex, weight) :
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

그래프의 응용
그래프의 응용에 대해 논의 해 보겠습니다.
- 그래프는 컴퓨터 과학에서 네트워크 그래프 또는 의미 그래프를 묘사하거나 계산의 흐름을 묘사하기 위해 광범위하게 사용됩니다.
- 그래프는 컴파일러에서 프로세스에 대한 리소스 할당을 나타내거나 데이터 흐름 분석 등을 나타 내기 위해 널리 사용됩니다.
- 그래프는 일부 특수 컴파일러에서 데이터베이스 언어의 쿼리 최적화에도 사용됩니다.
- 소셜 네트워킹 사이트에서 그래프는 사람들의 네트워크를 묘사하는 주요 구조입니다.
- 그래프는 교통 시스템, 특히 도로 네트워크를 구축하는 데 광범위하게 사용됩니다. 널리 사용되는 예는 그래프를 광범위하게 사용하여 전 세계의 방향을 나타내는 Google지도입니다.
결론
그래프는 다른 분야와는 별도로 컴퓨터 과학 분야 자체에서 많은 응용 프로그램을 가지고있는 널리 사용되고 광범위하게 사용되는 데이터 구조입니다. 그래프는 두 개 이상의 정점을 연결하는 정점과 가장자리로 구성됩니다.
그래프는 방향이 지정되거나 방향이 지정되지 않을 수 있습니다. 선형 표현 인 인접 행렬과 인접 연결 목록을 사용하여 그래프를 나타낼 수 있습니다. 또한이 튜토리얼에서 그래프 구현에 대해서도 논의했습니다.
=> 전체 C ++ 자습서 목록을 탐색하려면 여기를 참조하십시오.
추천 도서