※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 반드시 댓글로 알려주세요!
[ 1 ] 그래프
그래프란 연결되어 있는 원소간의 관계를 표현하는 자료구조이다. 그래프는 연결할 객체를 나타내는 정점(Vertex)과 정점들을 연결하는 간선(Edge)의 집합으로 구성된다. 그래프는 다음과 같이 정의할 수 있다.
G = (V, E)
[ 2 ] 인접 리스트로 그래프 표현하기
Java로 그래프를 표현하는 방법에는 대표적으로 세 가지가 있다. 첫 번째는 정수 배열 기반으로 에지 리스트를 나타낼 수 있고, 두 번째로는 2차원 배열을 기반으로 인접 행렬을 나타낼 수도 있다.
주로 사용되는 방법은 ArrayList를 이용해 인접 리스트로 그래프를 표현하는 방법이다.
(1) 가중치가 없는 무방향 그래프
(단, n은 정점의 개수이며 1~n의 정점이 존재하고, m은 간선의 개수라고 가정하자. s와 e는 간선으로 연결될 정점들이다)
public class Main {
static ArrayList<Integer>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
graph = new ArrayList[n + 1];
for(int i = 1; i < n+1; i++) {
graph[i] = new ArrayList<>();
}
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
graph[s].add(e);
graph[e].add(s);
}
}
}
무방향 그래프이기 때문에 graph[s].add(e), graph[e].add(s) 처럼 양방향 관계로 각 정점의 관계를 나타내야 한다.
(2) 가중치가 있는 방향 그래프
class Node {
int num;
int weight;
Node(int num, int weight) {
this.num;
this.weight;
}
}
public class Main {
static ArrayList<Node>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
graph = new ArrayList[n + 1];
for(int i = 1; i < n+1; i++) {
graph[i] = new ArrayList<Node>();
}
for(int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
graph[s].add(new Node(e, w));
}
}
}
무방향이며 가중치가 없는 그래프와 달리 방향 그래프이기에 s → e 방향으로만 정점 간의 관계를 나타내면 되고, 가중치를 저장해야 하기에 Node 클래스를 따로 정의해야 한다.
Node 클래스의 필드에는 간선이 가리키는 e 노드와 해당 간선의 가중치 w 가 있다.
'Programming > Java' 카테고리의 다른 글
[Java] Set Interface - HashSet (1) | 2023.03.06 |
---|---|
[Java] 스택(Stack)과, 큐(Queue) (3) | 2023.02.28 |
[Java] JVM의 메모리 구조(Runtime Data Area) (0) | 2023.02.22 |
[Java] 클래스, 객체, 인스턴스의 차이 및 객체 배열 (0) | 2023.02.17 |
[Java] JVM, Java 환경변수 설정(Mac, 기본 zsh 쉘) (5) | 2023.01.18 |