Algorithm/AlgoStudy
bfs,dfs,인접행렬,인접리스트(c++)
유쾌한고등어
2023. 2. 14. 05:51
● 인접행렬
<장점>
- 구현이 빠르다.
- 노드가 서로 연결되어 있는지 확인이 쉽다.
<단점>
- 특정 노드에 연결된 모든 노드를 검색할때,adj[i][1]~adj[i][v]를 전부 확인해야한다.
- 전체 노드 탐색시 시간복잡도가 O(V^2) 이다.
#include <iostream>
using namespace std;
int N,M;
int adj[10][10];
int main() {
cin >> n >> m;
for (int i=0;i<m;i++){
int a,b;
cin >> a >> b;
adj[a][b] = 1;
adj[b][a] = 1;
}
}
● 인접리스트
<장점>
- 특정 노드에 연결된 노드 바로 검색 가능
<단점>
- 노드가 서로 연결되어 있는지 확인이 오래걸린다.(특정노드가 검색노드 갖고있는지 리스트 탐색해야함)
#include <iostream>
using namespace std;
int n,m;
vector<int> adj[10];
int main(){
cin>>n>>m;
for (int i=0;i<n;i++){
int a,b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
}
dfs
#include <iostream>
#include <queue>
using namespace std;
const int MAX = 1001;
bool visit[MAX];
vector<int> adj[MAX];
queue<int> Q;
void DFS(int cur){
visit[cur] = true;
for (int i=0; i<adj[cur].size();i++){
int next = adj[cur][i]; // 현재노드 연결된 다음노드 next에 저장
if(visit[next]) continue; // 방문했다면 그 다음 노드로
DFS(next); // 방문하지 않았다면 DFS 탐색
}
}
int main() {
int n,m,v;
cin >> n >> m >> v;
for(int i=0;i<m;i++)
{
int s,e;
cin >> s >> e;
adj[s].push_back(e);
adj[e].push_back(s);
}
for(int i=1;i<=n;i++)
{
sort(adj[i].begin(),adj[i].end());
}
DFS(v);
}
bfs
#include <iostream>
#include <queue>
using namespace std;
const int MAX = 1001;
bool visit[MAX];
vector<int> adj[MAX];
queue<int> Q;
void BFS(int start){
memset(visit,false,sizeof(visit));
visit[start] = true;
Q.push(start);
while(!Q.empty()){
int x = Q.front();
Q.pop();
for(int i=0; i<adj[x].size(); i++){
int next = adj[x][i];
if(!visit[next]){
visit[next] = true;
Q.push(next);
}
}
}
}
int main(){
int n, m, v;
cin >> n >> m >> v;
for (int i=0; i<m; i++){
int s, e;
cin >> s >> e;
adj[s].push_back(e);
adj[e].push_back(s);
}
for(int i=1; i<=n; i++){ //선택사항(인접노드 순차방문 위함)
sort(adj[i].begin(),adj[i].end());
}
BFS(v);
}
(C++) BFS와 DFS, 인접행렬과 인접리스트
(블로그 이전 준비를 하면서 예전 블로그에 있던 글을 옮겨 적는중이다.) 알고리즘을 처음 시작할 때, 이것 저것 찾아보다가 python이나 c++ STL을 쓰세요. 라는 글을 꽤 봤었습니다. python으로 할 줄
seohyun0120.tistory.com