You are looking for information, articles, knowledge about the topic nail salons open on sunday near me c++ 그래프 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: c++ 그래프 c언어 그래프 출력, C 그래프 그리기, C 자료구조 그래프, c언어 그래프 dfs, c언어 그래프 인접행렬 구현, c언어 방향그래프, c언어 인접리스트 dfs, c언어 가중치 그래프
[자료구조론] C로 그래프를 만들자
- Article author: velog.io
- Reviews from users: 7293 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about [자료구조론] C로 그래프를 만들자 Updating …
- Most searched keywords: Whether you are looking for [자료구조론] C로 그래프를 만들자 Updating 안녕하세요. 김용성입니다.오늘은 그래프에 대한 개념을 설명하고, C로 간단하게 구현을 해보는 시간을 갖도록 하겠습니다.
- Table of Contents:
[자료구조론] C로 그래프를 만들자
- Article author: medium.com
- Reviews from users: 524 Ratings
- Top rated: 4.6
- Lowest rated: 1
- Summary of article content: Articles about [자료구조론] C로 그래프를 만들자 Updating …
- Most searched keywords: Whether you are looking for [자료구조론] C로 그래프를 만들자 Updating 안녕하세요. 김용성입니다.오늘은 그래프에 대한 개념을 설명하고, C로 간단하게 구현을 해보는 시간을 갖도록 하겠습니다.
- Table of Contents:
[자료구조] 그래프(Graph)란? – 컴도리돌이
- Article author: comdolidol-i.tistory.com
- Reviews from users: 49666 Ratings
- Top rated: 5.0
- Lowest rated: 1
- Summary of article content: Articles about [자료구조] 그래프(Graph)란? – 컴도리돌이 Updating …
- Most searched keywords: Whether you are looking for [자료구조] 그래프(Graph)란? – 컴도리돌이 Updating 그래프(Graph)란? 연결되어 있는 객체 간의 관계를 표현하는 자료구조이다. 그래프 G는 (V, E)로 표시되며 V는 정점 또는 노드라고 불리며, 여러 가지 특성을 가질 수 있는 객체를 의미하고 E는 간선 또는 링크로..
- Table of Contents:
[자료구조] 그래프(Graph)란? – 컴도리돌이
- Article author: ehpub.co.kr
- Reviews from users: 7816 Ratings
- Top rated: 3.2
- Lowest rated: 1
- Summary of article content: Articles about [자료구조] 그래프(Graph)란? – 컴도리돌이 typedef struct{//그래프 형식 정의 int vn; //정점 개수 int **matrix;//그래프 인접 행렬 }Graph;. 여기에서는 그래프 생성, 소멸, 간선 추가, 이웃 정점을 보여주는 … …
- Most searched keywords: Whether you are looking for [자료구조] 그래프(Graph)란? – 컴도리돌이 typedef struct{//그래프 형식 정의 int vn; //정점 개수 int **matrix;//그래프 인접 행렬 }Graph;. 여기에서는 그래프 생성, 소멸, 간선 추가, 이웃 정점을 보여주는 … 그래프(Graph)란? 연결되어 있는 객체 간의 관계를 표현하는 자료구조이다. 그래프 G는 (V, E)로 표시되며 V는 정점 또는 노드라고 불리며, 여러 가지 특성을 가질 수 있는 객체를 의미하고 E는 간선 또는 링크로..
- Table of Contents:
[자료구조] – C언어를 활용한 그래프의 구현
- Article author: apape1225.tistory.com
- Reviews from users: 47040 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about [자료구조] – C언어를 활용한 그래프의 구현 소프트웨어 마에스트로 코딩테스트를 봤다. 사실상 네문제를 풀었지만… 제출을 못해서 세문제… 처참한 결과였다. 정식적으로 알고리즘을 공부하려다 … …
- Most searched keywords: Whether you are looking for [자료구조] – C언어를 활용한 그래프의 구현 소프트웨어 마에스트로 코딩테스트를 봤다. 사실상 네문제를 풀었지만… 제출을 못해서 세문제… 처참한 결과였다. 정식적으로 알고리즘을 공부하려다 … 1. 개요 소프트웨어 마에스트로 코딩테스트를 봤다. 사실상 네문제를 풀었지만… 제출을 못해서 세문제… 처참한 결과였다. 정식적으로 알고리즘을 공부하려다 보니 DFS와 BFS를 만나게 되었는데, 이를 공부하..
- Table of Contents:
태그
‘programming자료구조’ Related Articles
티스토리툴바
[자료구조] 그래프 개념 및 구현(인접 리스트)
- Article author: aeunhi99.tistory.com
- Reviews from users: 42662 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [자료구조] 그래프 개념 및 구현(인접 리스트) 그래프(Graph)란, 노드(N)과 노드를 연결하는 간선(E)을 하나로 모아 놓은 자료 구조이다. 2. 대표적인 용어. 정점(Vertex) : 노드의 위치; 엣지(Edge) : … …
- Most searched keywords: Whether you are looking for [자료구조] 그래프 개념 및 구현(인접 리스트) 그래프(Graph)란, 노드(N)과 노드를 연결하는 간선(E)을 하나로 모아 놓은 자료 구조이다. 2. 대표적인 용어. 정점(Vertex) : 노드의 위치; 엣지(Edge) : … 1. 그래프의 개념 그래프(Graph)란, 노드(N)과 노드를 연결하는 간선(E)을 하나로 모아 놓은 자료 구조이다. 2. 대표적인 용어 정점(Vertex) : 노드의 위치 엣지(Edge) : 간선, 즉 노드들을 연결하는 선 분지, 차..
- Table of Contents:
태그
관련글
댓글0
공지사항
최근글
인기글
최근댓글
태그
전체 방문자
티스토리툴바
[C언어 자료구조] 7. 그래프(Graph)
- Article author: ehclub.co.kr
- Reviews from users: 39442 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [C언어 자료구조] 7. 그래프(Graph) 그래프는 정점과 간선으로 구성하는 자료구조예요. 그래프를 표현하는 방법은 여러가지가 있어요. 여기에서는 인접 행렬을 이용하는 방법과 연결리스트를 … …
- Most searched keywords: Whether you are looking for [C언어 자료구조] 7. 그래프(Graph) 그래프는 정점과 간선으로 구성하는 자료구조예요. 그래프를 표현하는 방법은 여러가지가 있어요. 여기에서는 인접 행렬을 이용하는 방법과 연결리스트를 … 7. 그래프(Graph) 이번에는 그래프를 알아보기로 해요. 그래프는 정점과 간선으로 구성하는 자료구조예요. 그래프를 표현하는 방법은 여러가지가 있어요. 여기에서는 인접 행렬을 이용하는 방법과 연결리스트를 이..초중고 교육 및 여행, 프로그래밍에 관한 글을 집필하여 온라인으로 무료 게시합니다.
- Table of Contents:
티스토리툴바
See more articles in the same category here: https://chewathai27.com/to/blog.
[자료구조론] C로 그래프를 만들자
안녕하세요. 김용성입니다.
오늘은 그래프에 대한 개념을 설명하고, C로 간단하게 구현을 해보는 시간을 갖도록 하겠습니다.
그래프
그래프하면 어떤 것이 떠오르나요? 초등학교 때 배웠던 막대 그래프? 아니면 고등학교 때 배웠던 x,y축 그래프?
컴퓨터에서 그래프는 객체 사이의 연결 관계를 표현할 수 있는 자료구조를 말합니다.🤗 대표적인 그래프의 예로는 지하철 노선도가 있습니다. 우리는 지하철 노선도에서 여러개의 역들이 어떻게 연결되어있는지 관계를 파악하고 쉽게 최단 경로를 찾을 수가 있죠.
그래프의 종류
그래프의 종류로는 무방향 그래프와 방향 그래프가 있습니다.
이름에서 알 수 있듯이 이 둘은 방향성을 가지고 있느냐, 아니냐로 나누어지게 되는데요. 무방향 그래프의 간선은 간선을 통해 양쪽 방향으로 갈수 있음을 나타내며, 정점 A와 정점 B가 간선을 통해 연결되어있다고 할 때, (A,B)로 나타낼 수가 있죠. 마찬가지로 (B,A)로도 나타낼 수 있기 때문에 (A,B)=(B,A)가 됩니다.
방향 그래프에서의 간선은 단방향성의 성질을 가지고 있어요. 방향 그래프에서의 간선은 ‘>’를 이용하여 나타내며 와 는 서로 다른 간선이되죠.
네트워크
간선에 가중치를 할당하게 되면 간선의 역할이 두 정점간의 연결 관계를 나타낼 뿐만 아니라 연결 강도(연결 비용이라던가 연결 거리) 등의 보다 복잡한 관계를 표현할 수가 있습니다. 이렇게 간선에 비용이나 가중치가 할당된 그래프를 가중치 그래프(weighted graph) 혹은 네트워크라 합니다.
위와 같은 그래프를 보면 A와 B 사이의 간선 즉, (A,B)가 5라는 값을 나타내고 있는 것으로 둘 사이 간선의 연결 비용이 5라는 의미를 내포합니다.
정점의 차수
그래프에서 가장 중요한 개념 중 하나라고 말할 수 있는 차수는 특정 정점에서 몇개의 인접 정점에 연결되어 있는지에 대한 개수를 의미합니다. 예를 들어 다음과 같은 그래프가 있다고 가정해봅시다.
위와 같은 그래프에서 A,B,C,D 각각의 차수는 어떻게 될까요?
A=3, B=2, C=2, D=3 이 될 것입니다. 이렇게 구한 차수들의 합을 구하면
10이라는 결과가 나오는데요. 모든 차수의 합은 간선 수의 2배라는 것에 대해 알아두시면 좋습니다.
정점의 차수 총합=간선의 개수*2
(참고로 방향 그래프에서는 외부에서 오는 간선의 개수를 진입 차수, 외부로 향하는 간선의 개수를 진출 차수라고 칭합니다.)
사이클
경로 중에서 반복되는 간선이 없을 경우에 이러한 경로를 단순 경로라고 합니다.
위 그림을 살펴보면 A에서 B까지 가는 경로는 A,C,D,B가 있습니다.
만약에 단순 경로의 시작 정점과 종료 정점이 동일하다면 이러한 경로를 사이클이라 합니다. 위 그림에서는 A,C,D,A를 예로 들 수 있겠네요.
연결 그래프
무방향 그래프 G에 있는 모든 정점쌍에 대하여 항상 경로가 존재한다면 G는 연결되어 있다고 하며 그래프 G는 연결 그래프라고 부르며 그렇지 않은 그래프를 비연결 그래프라고 합니다.
완전 그래프
그래프에 속해있는 모든 정점이 서로 연결되어 있는 그래프를 완전 그래프라고 합니다. 무방향 완전 그래프의 정점 수를 n이라고 하면, 하나의 정점은 n-1개의 다른 정점으로 연결되므로 간선의 수는 n(n-1)x2가 되죠. 만약 완전 그래프에서 n=4라면 간선의 수는 4×3/2=6이 됩니다.
다음 그림과 같은 형태를 우리는 완전 그래프라고 지칭합니다.
C로 그래프 구현
C코드를 통해서 그래프를 구현하기에 앞서 그래프를 추상 데이터 타입으로 정의해보도록 하겠습니다.
객체: 정점의 집합과 간선의 집합
연산:
create_graph() ::= 그래프를 생성.
init(g) ::= 그래프 g를 초기화.
insert_vertex(g,v) ::= 그래프 g에 정점 v를 추가.
insert_edge(g,u,v) ::= 그래프 g에 간선 (u,v) 추가.
delete_vertex(g,v) ::= 그래프 g의 정점 v를 삭제.
delete_edge(g,u,v) ::= 그래프 g의 간선 (u,v) 생성.
is_empty(g) ::= 그래프 g가 공백 상태인지 확인.
adgacent(v) ::= 정점 v에 인접한 정점들의 리스트 반환.
destroy_graph(g) ::= 그래프 g를 제거.
되게 많죠? 그렇지만 속을 들여다보면 간선 추가/삭제, 정점 추가/삭제, 그리고 리스트 반환 등 꼭 필요한 것들만 존재한다고 생각하실거예요.
그래프의 표현 방법
이제 그래프의 표현 방법에 대해서 알아보아야겠죠?
그래프를 표현하는 방법으로는 다음과 같이 두가지의 방법이 존재합니다.
인접 행렬: 2차원 배열을 사용하여 그래프를 표현
인접 리스트: 연결 리스트를 사용하는 그래프를 표현
위의 두가지 표현 방법은 각각 메모리 사용량과 처리 시간에 대해서 장단점을 가지므로, 문제에 적합한 표현 방법을 선택해야 합니다.
인접 행렬
그래프의 정점 수가 n이라면 nxn의 2차원 배열인 인접 행렬로 나타낼 수가 있어요. 연결되어 있다면 1, 연결되어 있지 않다면 0(자기 자신도)을 넣음으로써 간단하게 나타낼 수 있죠. 다음과 같이 말입니다.
이러한 인접 행렬은 두 정점을 연결하는 간선의 존재 여부를 바로 파악할 수가 있다는 장점이 있습니다. 시간 복잡도로 나타내도 O(1)로 나타낼 수가 있죠. 또한 정점의 차수 또한 O(n)의 시간복잡도로 구할 수가 있습니다. 그러나 만약 정점의 개수에 비해 간선의 수가 너무 적다면 희소 그래프가 되어 메모리의 낭비가 아주 커지게 된다는 단점이 존재합니다.
그러면 이번에는 인접 행렬을 이용하여 간단하게 그래프 코드를 구현해볼까요?
인접행렬 코드
그래프에 관련된 변수들을 하나의 구조체 GraphType에 정리해보도록 하겠습니다.
먼저 그래프에 존재하는 정점의 개수 n이 필요하고, 인접 행렬을 이용하여 구현화려면 또한 크기가 nxn인 2차원 배열인 인접 행렬이 필요합니다. 우리는 인접 행렬의 이름을 adj_mat이라고 하고 이를 정의해보도록 하겠습니다.
그리고 여기서는 정점의 개수를 n, 그리고 해당 구조체를 통해 최대로 정의할 수 있는 그래프의 정점의 개수는 50이라고 가정하겠습니다.
# define MAX_VERTICES 50 typedef struct GraphType { int n ; int adg_mat [ MAX_VERTICES ] [ MAX_VERTICES ] ; }
물론 이렇게 구현하면 한정된 개수의 정점까지만 그래프에 삽입할 수 있는데요. 동적 배열로 구현한다면 사용자가 정점을 삽입할 때마다 크기를 조정할 수 있게도 만들 수 있습니다. 전체 프로그램은 다음과 같습니다.
인접행렬 그래프 코드
# include
# include # define MAX_VERTICES 50 typedef struct GraphType { int n ; int adj_mat [ MAX_VERTICES ] [ MAX_VERTICES ] ; } GraphType ; void init ( GraphType * g ) { int r , c ; g -> n = 0 ; for ( r = 0 ; r < MAX_VERTICES ; r ++ ) for ( c = 0 ; c < MAX_VERTICES ; c ++ ) g -> adj_mat [ r ] [ c ] = 0 ; } void insert_vertex ( GraphType * g , int v ) { if ( ( ( g -> n ) + 1 ) > MAX_VERTICES ) { fprintf ( stderr , “overflow” ) ; return ; } g -> n ++ ; } void insert_edge ( GraphType * g , int start , int end ) { if ( start >= g -> n || end >= g -> n ) { fprintf ( stderr , “vertex key error” ) ; return ; } g -> adj_mat [ start ] [ end ] = 1 ; g -> adj_mat [ end ] [ start ] = 1 ; } void print_adj_mat ( GraphType * g ) { for ( int i = 0 ; i < g -> n ; i ++ ) { for ( int j = 0 ; j < g -> n ; j ++ ) { printf ( “%2d” , g -> adj_mat [ i ] [ j ] ) ; } printf ( ” ” ) ; } } void main ( ) { GraphType * g ; g = ( GraphType * ) malloc ( sizeof ( GraphType ) ) ; init ( g ) ; for ( int i = 0 ; i < 4 ; i ++ ) insert_vertex ( g , i ) ; insert_edge ( g , 0 , 1 ) ; insert_edge ( g , 0 , 2 ) ; insert_edge ( g , 0 , 3 ) ; insert_edge ( g , 1 , 2 ) ; insert_edge ( g , 2 , 3 ) ; print_adj_mat ( g ) ; free ( g ) ; } 위 main 함수는 제가 위에 올린 그림과 같은 그래프를 만들어 줍니다. 따라서 출력내용은 다음과 같습니다. 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 인접 리스트 인접 리스트는 그래프를 표현함에 있어 각각의 정점에 인접한 정점들을 연결 리스트로 표시한 것입니다. 각 연결 리스트의 노드들은 인접 정점들을 저장하게 되며 각 연결 리스트들은 헤더 노드를 가지고 있고 이 헤더 노드들은 하나의 배열로 구성되어 있습니다. 따라서 정점의 번호만 알면 이 번호를 배열의 인덱스로 하여 각 정점의 연결 리스트에 쉽게 접근할 수가 있습니다. 인접 행렬과는 다소 다른 부분이 존재하는데, 무방향 그래프를 나타낼 시에 간선 (i,j)를 정의할 때 (j,i)를 한번 더 표현해주어야 합니다. 또한 연결 리스트에 정점들이 입력되는 순서에 따라 연결 리스트 내에서 정점들의 순서가 달라질 수 있습니다. 위 그림을 보면 연결리스트로 정점으로부터의 인접정점들이 담긴 리스트가 생겨나는 것을 볼 수 있습니다. 0->1->2->3 : 3
1->0->2 : 2
2->0->1->3 : 3
3->0->2 : 2
리스트를 추상화한 모습을 보면 정점의 개수가 4개, 간선이 5개인 그래프를 표현하기 위해서는 리스트가 총 4개 그리고 연결된 노드들은 총 10개가 필요함을 확인할 수 있습니다.
이제 인접 리스트를 통한 그래프의 특성을 알아보아야 합니다.
정점의 수가 n개이고 간선의 수가 e개인 무방향 그래프를 표시하기 위해서는 n개의 연결리스트가 필요하고, n개의 헤더 노드와 2e개의 노드가 필요합니다.
이제 인접리스트 그래프를 코드로 표현해보도록 하겠습니다.
인접리스트 그래프 코드
# include
# include # define MAX_VERTICES 50 typedef struct GraphNode { int vertex ; struct GraphNode * link ; } GraphNode ; typedef struct GraphType { int n ; GraphNode * adj_list [ MAX_VERTICES ] ; } GraphType ; void init ( GraphType * g ) { int v ; g -> n = 0 ; for ( v = 0 ; v < MAX_VERTICES ; v ++ ) g -> adj_list [ v ] = NULL ; } void insert_vertex ( GraphType * g , int v ) { if ( ( ( g -> n ) + 1 ) > MAX_VERTICES ) { fprintf ( stderr , “overflow” ) ; return ; } g -> n ++ ; } void insert_edge ( GraphType * g , int u , int v ) { GraphNode * node ; if ( u >= g -> n || v >= g -> n ) { fprintf ( stderr , “vertex index error” ) ; return ; } node = ( GraphNode * ) malloc ( sizeof ( GraphNode ) ) ; node -> vertex = v ; node -> link = g -> adj_list [ u ] ; g -> adj_list [ u ] = node ; } void print_adj_list ( GraphType * g ) { for ( int i = 0 ; i < g -> n ; i ++ ) { GraphNode * p = g -> adj_list [ i ] ; printf ( “정점 %d의 인접 리스트” , i ) ; while ( p != NULL ) { printf ( “->%d” , p -> vertex ) ; p = p -> link ; } printf ( ” ” ) ; } } int main ( ) { GraphType * g ; g = ( GraphType * ) malloc ( sizeof ( GraphType ) ) ; init ( g ) ; for ( int i = 0 ; i < 4 ; i ++ ) insert_vertex ( g , i ) ; insert_edge ( g , 0 , 1 ) ; insert_edge ( g , 1 , 0 ) ; insert_edge ( g , 0 , 2 ) ; insert_edge ( g , 2 , 0 ) ; insert_edge ( g , 0 , 3 ) ; insert_edge ( g , 3 , 0 ) ; insert_edge ( g , 1 , 2 ) ; insert_edge ( g , 2 , 1 ) ; insert_edge ( g , 2 , 3 ) ; insert_edge ( g , 3 , 2 ) ; print_adj_list ( g ) ; free ( g ) ; return 0 ; } 실행 결과는 다음과 같습니다. 정점 0의 인접 리스트 -> 3 -> 2 -> 1
정점 1의 인접 리스트 -> 2 -> 0
정점 2의 인접 리스트 -> 3 -> 1 -> 0
정점 3의 인접 리스트 -> 2 -> 0
마무리
오늘은 그래프에 대해서 알아보고, 인접행렬과 인접리스트를 통해 그래프를 구현해보는 포스팅을 진행하였는데요. 제가 처음에 언급했듯이 그래프는 노드 간의 연결관계를 쉽게 파악하고 최단 경로를 찾기 용이합니다. 그렇기에 아무래도 그래프의 백미는 BFS,DFS라고 할 수 있는데요. 다음 자료구조론 포스팅에서는 그래프 탐색 DFS, BFS를 다뤄보도록 하겠습니다.
읽어주셔서 감사합니다:)
☺️
[자료구조] 그래프(Graph)란?
728×90
728×90
그래프(Graph)란?
연결되어 있는 객체 간의 관계를 표현하는 자료구조이다. 그래프 G는 (V, E)로 표시되며 V는 정점 또는 노드라고 불리며, 여러 가지 특성을 가질 수 있는 객체를 의미하고 E는 간선 또는 링크로 정점들 간의 관계를 의미한다.
그래프의 종류
무방향 그래프(undirected graph)
간선을 통해서 양방향으로 갈 수 있다.
방향 그래프(directed graph)
간선을 통해서 한쪽 방향으로만 갈 수 있다.
가중치 그래프(weighted graph)
간선에 비용이나 가중치가 할당된 그래프
그래프(graph)의 용어
인접 정점(adjacent vertex) :하나의 정점에서 간선에 의해 직접 연결된 정점
G1에서 정점 0의 인접 정점 : 1,2,3
차수(degree) : 하나의 정점에 연결된 간선의 수
G1에서 정점 0의 차수 : 3
경로(path) : 간선을 따라갈 수 있는 길
-무방향 그래프의 정점 s로부터 정점 e까지의 경로
-방향 그래프의 정점 s로부터 정점 e까지의 경로
경로의 길이(length) : 경로를 구성하는 데 사용된 간선의 수
단순 경로(simple path) : 경로 중에서 반복되는 간선이 없는 경로
1,0,2,3 단순 경로 <> 1,0,2,0은 단순 경로 x
사이클(cycle) : 시작 정점과 종료 종료 정점이 동일한 경로
사이클 0,1,2
인접 행렬로 구현한 그래프 그림 예시 && c언어 코드
인접 행렬로 구현한 그래프 그림 예시
#include
#include #define MAX_VTXS 256 void error(char str[]) // 오류 메시지 출력후 종료 함수: 공통 { printf(“%s “, str); exit(1); } typedef char VtxData; // 그래프 정점에 저장할 데이터의 자료형 int adj[MAX_VTXS][MAX_VTXS]; // 인접 행렬 int vsize; // 전체 정점의 개수 VtxData vdata[MAX_VTXS]; // 정점에 저장할 데이터 배열 int is_empty_graph() { return (vsize == 0); } int is_full_graph() { return (vsize >= MAX_VTXS); } void init_graph() { int i, j; vsize = 0; for (i = 0; i
#include #define MAX_VTXS 256 void error(char str[]) // 오류 메시지 출력후 종료 함수: 공통 { printf(“%s “, str); exit(1); } typedef struct GraphNode { int id; // 정점의 id struct GraphNode* link; // 다음 노드의 포인터 } GNode; typedef char VtxData; // 그래프 정점에 저장할 데이터의 자료형 GNode* adj[MAX_VTXS]; // 각 정점의 인접 리스트 -> 이중포인터로 사용해도됌 int vsize; // 정점의 개수 VtxData vdata[MAX_VTXS]; // 정점에 저장할 데이터 배열 int is_empty_graph() { return (vsize == 0); } int is_full_graph() { return (vsize >= MAX_VTXS); } void init_graph() //그래프 초기화 { int i; vsize = 0; for (i = 0; i
link; free(n); } } vsize = 0; } void insert_vertex(VtxData name) { if (is_full_graph()) error(“Error: 그래프 정점의 개수 초과 “); else vdata[vsize++] = name; } void insert_edge(int u, int v) { GNode* n = (GNode*)malloc(sizeof(GNode)); n->link = adj[u]; n->id = v; adj[u] = n; } void print_graph(char* msg) { int i; GNode* v; printf(“%s%d
“, msg, vsize); for (i = 0; i
link) printf(” %c”, vdata[v->id]); printf(” “); } } void load_graph(char *filename) { int i, j, val, n; char str[80]; FILE *fp = fopen(filename, “r”); if (fp != NULL) { init_graph(); fscanf(fp, “%d”, &n); for (i = 0; i
[자료구조] – C언어를 활용한 그래프의 구현
반응형
1. 개요
소프트웨어 마에스트로 코딩테스트를 봤다. 사실상 네문제를 풀었지만… 제출을 못해서 세문제… 처참한 결과였다. 정식적으로 알고리즘을 공부하려다 보니 DFS와 BFS를 만나게 되었는데, 이를 공부하면서 그래프라는 자료구조를 또 만나게 되었다. 사실 DFS 알고리즘인지를 모르고 사용한 적이 있었는데, 이를 더 공부해볼 생각이다. 다음은 내가 푼 문제이다.
apape1225.tistory.com/61
2. 이론
– 그래프란?
백문이불여일견! 다음과 같은 그래프를 본적이 있다면 그래프를 본것이다.
뭔 거미줄 같이 생기긴 했지만, 조금 관점을 다르게 정의할 수 있다. 그래프는 ‘정점의 모음’과 이 정점을 잇는 ‘간선의 모음’과의 결합이다. (뇌를 자극하는 알고리즘, 박상현 저) 그림을 보면 숫자(정점) 들이 선(간선)으로 연결된 모습을 볼 수 있는데, 이것 자체가 그래프이다. 여기서 간선으로 연결되어 있는 점은 서로 인접해있다고 한다. 이 외에 경로와 사이클같은 개념은 알고리즘을 설명할 때 게시하도록 하겠다.
이제 그래프의 기본적인 형태를 알았으니 가장중요한 문제를 해결해보자. 바로 코드로 그래프를 표현하는 것이다. 코드로 그래프를 표현 ( 혹은 구현 )하는 방법은 두가지가있다. 하나는 행렬로 표현하는 방법이고 나머지 하나는 리스트로 표현하는 방법이다. 이 글에서는 리스트로 그래프를 표현하는 방법을 다룰것이다.
– 리스트로 구현하는 그래프
이론은 간단하다. 모든 정점들을 리스트로 표현하고, 그 정점과 인접된 정점들을 옆에 나열하는 것이다. 위의 그래프를 리스트로 표현하자면 다음과 같을 것이다.
그림을 연보라색으로 표현된 각 정점들 옆으로 정점에 인접해있는 정점들이 나열되어있다. 이렇게 연결 리스트로 그래프를 표현할 수 있다. 이번에는 방향성 그래프를 알아보도록 하자. 다음은 방향성 그래프의 그림이다.
이 그래프를 보도록 하자. 첫번째로 본 그래프와는 뭐가 다를까? 바로 방향이다. 첫번째 그래프는 정점들끼리 연결만 되어있지만 이 방향성 그래프는 한 정점이 다른 정점을 가리킨다는 것이 가장 큰 차이이다. 그럼 이 그래프를 리스트로 표현하려면 어떻게 해야할까? 무방향성 그래프 즉 우리가 처음으로 살펴본 그래프는 한 정점과 인접한 정점은 전부 옆에 연결시켰다. 하지만 방향성 그래프는 한정점이 가리키는 정점만 옆에다 두는 것이다.
예를 들어서 1이 가리키는 정점은 2와 4이므로 1옆에는 2와 4만이 존재하면 되는 것이다. 이렇게 따지면 4는 2만을 가리키고 있으므로 4옆에는 2만이 존재하면 된다. 그림으로 표현하자면 다음과 같다.
이렇게 가리키는 정점들만을 옆에 두어 그래프를 구현한다. 자 이제 코드측면으로 보자. 위의 그림과 아래의 그림을 비교해보자.
방향성 그래프를 구현한 리스트와 위의 트리는 그냥 똑같은 수준이다. 문제는 정점과 인접하고있는 정점 이 두가지 정점의 분류가 매우 희박해진다는 것이다. 결국 우리는 모든 정점을 표시한 ‘정점’과 그 정점옆에 나열되어야할 ‘인접해있는 정점’ 을 구분해줘야 한다는 것이다. 나는 책과 인터넷을 참고하여 서로 다른 구조체를 정의해 코드를 작성하였다. 조금 더 깔끔하게 그림으로 표현해보았다.
자 위의 그림을 보자. 모든 정점을 표현하는 정점은 Vertex 구조체로 구현하였고 그 옆에 나열되어있는 점은 Edge 구조체로 구현하였다. 그리고 이 전체를 가리키는 Graph 구조체가 있다. 다음은 코드의 구현이다.
3. 코드구현
– Graph.h
#pragma once #include
#include typedef char ElementType; typedef struct str_Graph { struct str_Vertex* graph; int vertexCount; }Graph, *GraphPtr; typedef struct str_Vertex { ElementType data; struct str_Vertex* Next; struct str_Edge* Edges; int index; int visited; }Vertex, *VertexPtr; typedef struct str_Edge { struct str_Vertex* start; struct str_Vertex* end; struct str_Edge* Next; int weight; }Edge, *EdgePtr; GraphPtr createGraph(); void deleteGraph(GraphPtr G); VertexPtr createVertex(ElementType data); void deleteVertex(VertexPtr V); EdgePtr createEdge(VertexPtr start, VertexPtr end, int weight); void deleteEdge(EdgePtr E); void addVertex(GraphPtr G, VertexPtr V); void addEdge(VertexPtr V, EdgePtr E); void printGraph(GraphPtr G); 앞서 말한 구조체 부분들을 정의하고 각 메소드들을 정의하였다. 아직 알고리즘을 구현하지 않았기에 기본적으로 정점을 추가하고 Edge를 추가하는 부분을 만들었다. 그리고 마지막으로 그래프를 출력하는 코드 또한 선언하였다. 다음은 코드 구현부분이다.
– Graph.c
#include “Graph.h” GraphPtr createGraph() { GraphPtr G = (GraphPtr)malloc(sizeof(Graph)); G->graph = NULL; G->vertexCount = 0; return G; } VertexPtr createVertex(ElementType data) { VertexPtr nVertex = (VertexPtr)malloc(sizeof(Vertex)); nVertex->data = data; nVertex->Edges = nVertex->Next = NULL; nVertex->visited = 0; nVertex->index = -1; return nVertex; } void deleteVertex(VertexPtr V) { VertexPtr delV = V; EdgePtr edge = V->Edges->Next; while (edge) { deleteEdge(V->Edges); V->Edges = edge; edge = edge->Next; } deleteEdge(V->Edges); free(delV); } EdgePtr createEdge(VertexPtr start, VertexPtr end, int weight) { EdgePtr edge = (EdgePtr)malloc(sizeof(Edge)); edge->start = start; edge->end = end; edge->Next = NULL; edge->weight = weight; } void deleteEdge(EdgePtr E) { free(E); } //여기서부터 구현해라 창규야 ^^ void deleteGraph(GraphPtr G) { if (G->graph) { VertexPtr V = G->graph; while (V) { VertexPtr Next = V->Next; deleteVertex(V); V = Next; } } } void addVertex(GraphPtr G, VertexPtr V) { V->index = G->vertexCount + 1; if (G->graph) { VertexPtr buff = G->graph; while (buff->Next) buff = buff->Next; buff->Next = V; } else { G->graph = V; } } void addEdge(VertexPtr V, EdgePtr E) { if (V->Edges) { EdgePtr buff = V->Edges; if (buff->Next) buff = buff->Next; buff->Next = E; } else { V->Edges = E; } } void printGraph(GraphPtr G) { if (G->graph) { VertexPtr V = G->graph; while (V) { printf(“[%c] : “, V->data); EdgePtr E = V->Edges; while (E) { printf(“-> [%c] “, E->end->data); E = E->Next; } printf(”
“); V = V->Next; } } return 0; }
각 정점과 인접된 정점의 구분이 확실하다면 코드구현이 그렇게 까다롭지 않다는 것을 알 수 있다. 물론 나같은 사람은 조금 오래 걸릴수도 있지만… 다음은 위의 그래프를 사용해보는 main함수와 실행결과이다.
– 실행결과
#include “Graph.h” int main(void) { GraphPtr G = createGraph(); //printf(“!”); VertexPtr V1 = createVertex(‘1’); VertexPtr V2 = createVertex(‘2’); VertexPtr V3 = createVertex(‘3’); VertexPtr V4 = createVertex(‘4’); addVertex(G, V1); addVertex(G, V2); addVertex(G, V3); addVertex(G, V4); addEdge(V1, createEdge(V1, V2, 0)); addEdge(V1, createEdge(V1, V4, 0)); addEdge(V2, createEdge(V2, V3, 0)); addEdge(V3, createEdge(V3, V4, 0)); addEdge(V4, createEdge(V4, V2, 0)); printGraph(G); deleteGraph(G); return 0; }
4. 결어
다음은 본격적으로 알고리즘에 대해 포스팅할것이다. 하필 개강도 겹쳐서 공부할 것이 많지만, 최대한 꾸준히 올려볼 것이다.
반응형
So you have finished reading the c++ 그래프 topic article, if you find this article useful, please share it. Thank you very much. See more: c언어 그래프 출력, C 그래프 그리기, C 자료구조 그래프, c언어 그래프 dfs, c언어 그래프 인접행렬 구현, c언어 방향그래프, c언어 인접리스트 dfs, c언어 가중치 그래프