티스토리 뷰
Graph (그래프)
Traversal / Search (순회,탐색)
- DFS(Depth First Search) 깊이우선탐색
- BFS(Breadth First Search) 너비우선탐색
Spanning Tree (신장트리)
DFST(Depth First Spanning Tree) 깊이우선 신장트리BFST(Breadth First Spanning Tree) 너비우선 신장트리- MST,MCST(Minimum_Cost Spanning Tree) 최소_비용 신장트리 : Kruskal, Prim 's Alg
Distance (최단거리 등)
- Dijkstra 's Alg
- Floyd-Warshall 's Alg
- Bellman-Ford 's Alg
Etc
- Network Flow
- Bipartite Matching
Graph
- Vertex, Edge
- 종류 : 무방향/방향/완전/부분/가중 그래프 ..
- 정점 V1,V2가 간선 E로 연결되있다면, V1과V2는 adjacent(인접)하고, E는 V1과V2에 incident(부속)한다
- degree, path, cycle
구현
- Adjacent Matrix
- Adjacent List
두 정점 u,v가 인접한지 확인하는 경우라면,
인접행렬은 adj_matrix[u][v]의 값을 참조하기만하면 된다. 시간복잡도=O(1)
인접리스트는 adj_list[u]에 연결된 원소들을 순회하며 v의 존재를 확인해야한다. 최악의 경우 시간복잡도=O(|V|)
한편, 정점 u에 연결된 모든 정점을 탐색하는 경우라면,
인접행렬은 모든 adj_matrix[u][i]를 참조해야한다. 시간복잡도=O(|V|)
인접리스트는 adj_list[u]의 개수만큼만 걸린다. (물론 최악의경우엔 O(|V|)지만 탐색을 전체그래프로 확장하면 달라짐, 인접행렬의 공간복잡도는 O(|V|2)이고 인접리스트는 O(|E|)이다)
따라서, 각 정점간의 연결관계 참조가 잦다면 인접행렬 표현이, 순회가 잦거나 |V|가 크다면 인접리스트 표현이 유리하다.
인접행렬로 표현된 그래프를 받아 인접리스트로 변환하는 코드
Input | Output |
첫 줄에 정점의 개수 V가 주어집니다. (1 ≤ V ≤ 55) 두번째 줄부터 V줄에 걸쳐 V번 정점과 1 - V번 정점의 연결 관계가 입력됩니다. V번째 줄의 i번째 값이 1이면 V에서 출발해 i번 정점으로 향하는 간선이 존재한다는 의미이며, 0이면 이러한 간선이 존재하지 않는 다는 의미입니다. | 1번부터 V번 정점까지 V개 줄에 걸쳐 각 정점의에 연결된 정점의 번호를 아래 예제와 같은 형태로 출력합니다. |
import java.util.*;
public class Test {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] adj_matrix = new int[n + 1][n + 1];
ArrayList<Integer>[] adj_list = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
adj_list[i] = new ArrayList<>();
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
adj_matrix[i][j] = scanner.nextInt();
if (adj_matrix[i][j] == 1) {
adj_list[i].add(j);
}
}
}
for (int i = 1; i <= n; i++) {
System.out.print(i + " : ");
for (int j = 0; j < adj_list[i].size(); j++) {
System.out.print(adj_list[i].get(j) + " ");
}
System.out.println();
}
}
}
'Data Structure' 카테고리의 다른 글
자료구조) Tree - Binary Search Tree, Segment Tree, Binary Indexed Tree (0) | 2019.09.12 |
---|---|
자료구조) Tree - Heap, Priority Queue (힙, 우선순위 큐) (0) | 2019.09.12 |
자료구조) Tree, Binary Tree (트리, 이진트리) (0) | 2019.09.12 |
자료구조) Hash (해시) (0) | 2019.09.12 |
자료구조) Stack, Queue (스택, 큐) (0) | 2019.09.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 해외여행
- webhacking.kr
- brute-force
- javascript
- graph
- 리버싱
- Vo
- OneToMany
- dfs
- FRAGMENT
- 개발자
- 프로그래머스
- Java
- Algorithm
- mysql
- 웹해킹
- 회고
- bfs
- git
- Android Studio
- C
- JPA
- queue
- Android
- socket
- Stack
- 우아한 테크코스
- Data Structure
- sort
- reversing
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함