i) 정점이나 간선에 추가적 속성을 부여한 경우
방향 그래프/유향 그래프(directed graph)
무(방)향 그래프(undirected graph)
+) 2-1. 연결 그래프(connected graph)
모든 정점쌍에 대하여 항상 경로가 존재
2-2. 완전 그래프(complete graph)
그래프에 속해있는 모든 정점이 서로 연결되어 있는 그래프
(정점의 수) = n , (각 정점의 차수) = n-1 , (간선의 수) = nX(n-1)/2
가중치 그래프(weighted graph) / 네트워크(network)
ii) 간선이나 정점의 형태에 제약을 둔 경우
1. 다중 그래프(multigraph)
* 두 정점 사이에 두 개 이상의 간선이 있는 경우
단순 그래프(simple graph)
트리/루트 없는 트리(unrooted tree)
이분 그래프(bipartite graph)
사이클 없는 방향 그래프(DAG - directed acyclic graph)
+) 6. 부분 그래프(subgraph)
-무방향 그래프
-방향 그래프
문제:
어떤 철도망에서 한 역이 폐쇄되어 열차가 지나지 못할 경우 철도망 전체가 두 개 이상으로 쪼개질 가능성이 있는지, 있다면 어느 역이 그런 위험성을 갖고 있는지 분석
정점:
철도의 각 역
간선:
두 역 사이를 연결하는 철로
관련 알고리즘:
절단점 찾기 알고리즘
문제:
소셜 네트워크를 통해 사람들 간의 지인/친밀도 관계를 파악할 수 있음. 이를 통해 한 다리 건너 알고 있는 사람은 몇 명이나 되는지, 몇 다리나 건너가야 누군가와 내가 아는 사이인지 알 수 있음
정점:
소셜 네트워크 사이트의 회원
간선:
두 회원이 서로 친구 사이인 경우 연결
관련 알고리즘:
그래프의 너비 우선 탐색
문제:
어떤 경로의 시간당 전송 용량은 이 경로가 지나는 케이블 중 가장 작은 전송 용량을 갖는 케이블에 의해 좌우됨. 이때 두 컴퓨터 간의 전송 용량 계산
정점:
인터넷에 연결된 라우터와 컴퓨터
간선:
두 기계를 연결하는 케이블
관련 알고리즘:
최소 스패닝 트리 알고리즘
문제:
종이에서 연필을 떼지 않고 주어진 도형을 그리되, 모든 선을 한 번씩만 지날 수 있는지. 즉, 모든 간선을 한 번씩만 지나는 경로를 찾을 수 있는지.
정점:
선들이 만나는 점
간선:
점들을 연결하는 선
관련 알고리즘:
오일러 경로(Eulerian path), 깊이 우선 탐색
문제:
외환 거래 시장은 달러, 유로, 엔, 스위스 프랑 등의 통화(currency)와 이들 간의 교환 비율로 구성됨. 1달러를 들고 유로로 바꾸고, 유로를 엔으로 바꿨다가, 다시 달러로 바꿨을 때 1달러보다 많은 돈을 가지게 되는 것을 아비트러지(arbitrage)라고 함. 환율 목록이 주어질 때 아비트러지가 존재하는지 여부
+) 아비트러지가 있다 ⇔ 간선 가중치의 합이 음수인 사이클이 있다
정점:
통화
간선:
서로 교환 가능한 통화들 사이에 (방향이 있는) 간선
관련 알고리즘:
최단 거리 알고리즘
문제:
의존 관계에 있는 여러 할 일이 있을 때 이들을 한 번에 하나씩 해나갈 방법이 있는지, 있다면 어느 순서대로 하면 되는지 계산
관련 알고리즘:
위상 정렬(topological sorting), 깊이 우선 탐색
문제:
1~15 숫자 타일을 움직여 원래 있던 순서대로 정렬하는 15-퍼즐 문제
정점:
현재 타일의 배치
간선:
한 배치에서 타일을 한 번 움직여 다른 배치를 얻을 수 있을 때 두 정점 연결
관련 알고리즘:
최단 경론 문제
문제:
정사각현의 게임판(가로,세로 길이:N)을 1X2크기의 블록으로 모든 칸을 덮는 문제
정점:
막히지 않는 각 칸
간선:
상하좌우로 인접한 칸들 사이 연결
관련 알고리즘:
이분 그래프, 이분 매칭 그래프
문제:
N개의 팀이 회의를 하려고 하는데, 회의실이 하나뿐인 관계로 한 번에 한 팀만 사용할 수 있음. 각 팀이 회의실을 사용하고 싶은 시간을 각각 두 개씩 적어 냈을 때 모든 팀이 회의하도록 배정하는 방법 찾기.
관련 알고리즘:
만족성 문제(satisfiability problem), 2-SAT(두 선택지 중 하나를 선택해야 하는 문제), 강 결합성 문제
각 정점마다 하나의 연결 리스트를 갖음
vector <list<int>> adjacent;
adjacent[i] : 정점 i와 간선을 통해 연결된 정점들의 번호 저장
#define MAX_VERTICES 50 typedef struct GraphNode{ int vertex; struct GraphNode *link; } GraphNode; typedef struct GraphType{ int n;//정점의 개수 GraphNode * adj_list[MAX_VERTICES]; }GraphType;
간선이 추가적 속성을 갖고 있음
//1. 간선의 정보를 구조체로 표현 struct Edge{ int vertex; int weight; }; //2. 단순하게 pair 사용 pair<int,int>
2차원 불린 값 배열
vector<vector<bool>> adjacent;
adjacent[i,j] : 정점 i에서 정점 j로 가는 간선이 있는지를 나타내는 불린 값 변수
#define MAX_VERTICES 50 typedef struct GraphType{ int n;//정점의 개수 int adj_mat[MAX_VERTICES][MAX_VERTICES]; } GraphType
무방향 그래프 - 간선 삽입 시 adj[start][end]와 adj[end][start]에 1 삽입
방향 그래프 - 간선 삽입 시 adj[start][end]에만 1삽입
간선이 추가적 정보를 갖고 있음
vector<vector<int>> adjacent; vector<vector<double>> adjacent;
두 정점 사이에 간선이 없을 경우 -1 또는 아주 큰 값 등 존재할 수 없는 값으로 지정
-인접 리스트
-인접 행렬