- 정점(or 노드)
: 데이터를 나타내는 요소- 간선
: 정점들을 연결하는 선으로 방향성을 가지는지 여부에 따라 방향 그래프와 무방향 그래프가 결정됨
- 정점 : {1,2,3,4,5,6}
- 간선 : {(1,2),(1,5),(2,3),(2,4),(2,5),(3,4),(4,5),(4,6)}
① 인접 행렬 (Adjacency - matrix)
정점의 개수(V)를 가지고 V x V 이차원 배열을 생성
int graph[6][6];
/*
i행j열 : i행 -> j열로 간선이 존재하면 (1), 존재하지 않으면(0)
010010
101110
010100
011011
110100
000100
*/
② 인접 리스트
벡터(vector)를 이용해 구현
(연결 리스트를 이용해 구현할 수 도 있음)
#include <vector>
vector<int> adj[6];
/*
adj[1] = {2,5}
adj[2] = {1,3,4,5}
adj[3] = {2,4}
adj[4] = {3,5,2,6}
adj[5] = {1,2,4}
adj[6] = {4}
*/
// v: 정점 e: 간선
int v,e;
// 인접 리스트
vector<vector<int>> graph;
// 방문 여부
vector<bool> isVisited;
void DFS(int cur){
// 현재 방문한 노드 표시
isVisited[cur]=true;
// 현재의 정점과 간선으로 연결되어 있는 모든 정점을 순회
for(int i=0;i<graph[cur];i++)}
int next = graph[cur][i];
if(!isVisited[next]){
DFS(next);
}
}
}
// 정점과 간선을 입력받아 인접 리스트로 저장
int main(){
cin>>v>>e;
graph.assign(v+1,vector<int>(0,0));
for(int i=0;i<e;i++){
int s,e;
cin>>s>>e;
graph[s].emplace_back(e);
graph[e].emplace_back(s);
}
}
① 현재의 노드에서 가장 가까운 노드부터 우선적으로 탐색하는 알고리즘
② 큐를 사용하여 구현
// v: 정점 e: 간선
int v,e;
// graph[1] = 1번 노드와 연결된 정점들
// graph[2] = 2번 노드와 연결된 정점들
// ...
vector<int>graph[v];
// 정점의 방문 여부
bool isVisited[v];
void BFS(int start, vector<int>graph[],bool check[]){
queue<int> q;
q.push(start);
check[start] = true;
while(!q.empty()){
int tmp = q.front();
q.pop();
// 현재 노드와 연결된 모든 노드를 방문
for(int i=0;i<graph[tmp].size();i++){
// 방문하지 않은 경우 방문하기
if(check[graph[tmp[i]]==false){
q.push(graph[tmp][i]);
check[graph[tmp][i]]=true;
}
}
}
}
int main(){
for(int i=0;i<e;i++){
int u,v;
cin>>u>>v;
graph[u-1].push_back(v);
graph[v-1].push_back(u);
}
for(int i=0;i<n;i++){
sort(graph[i].begin(),graph[i].end());
}
return 0;
}