1. 2주차 주제 & 복습
2주차 주제 : 그래프
(복습 내용은 제가 다시 알게 된 중요 내용 위주로 작성하였습니다)
그래프
인접 행렬 표현
인접 리스트 표현
인접 정점을 연결리스트로 표현
(사진 출처 : https://sarah950716.tistory.com/12)
n개의 연결리스트 adjList[n] (n : vertex의 수)
인접행렬 vs 인접리스트
인접행렬
인접리스트
DFS (깊이 우선 탐색)
BFS (너비 우선 탐색)
2. 과제 풀이
백준 5567번 결혼식
혼자 힘으로는 막혀버렸고.. 다른 분의 설명과 코드를 참고하면서 공부를 하면서 해결방법을 익혔다.
참고한 글 : https://scarlettb.tistory.com/95
#include <iostream>
using namespace std;
//#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
const int MAX = 501;
int num_ppl; // 동기 수
int num_list; // 리스트 수
int arr[MAX][MAX]; // 인접행렬
bool visited[MAX]; // 방문 여부
bool sFriend[MAX]; // 상근이와 친구 여부
int count_num = 0; // 초대할 친구 수
void count() {
// 상근이의 친구
for (int i = 2; i <= num_ppl; i++) {
if (arr[1][i] == 1) {
visited[i] = true; // 방문
sFriend[i] = true; // 상근이와 친구
}
}
// 상근이의 친구의 친구
for (int i = 2; i <= num_ppl; i++) {
if (sFriend[i]) { // 상근이의 친구인 경우
for (int j = 1; j <= num_ppl; j++) {
if (arr[i][j]) { // 친구의 친구인 경우
visited[j] = true;
}
}
}
}
// 초대 인원 계산
for (int i = 2; i <= num_ppl; i++) {
if (visited[i]) count_num++;
}
}
int main() {
scanf("%d", &num_ppl); // 동기 수
scanf("%d", &num_list); // 리스트 수
while (num_list--) {
int f1, f2;
scanf("%d %d", &f1, &f2);
//cin >> f1 >> f2;
arr[f1][f2] = 1;
arr[f2][f1] = 1;
}
count();
printf("%d", count_num);
return 0;
}
int** arr = new int*[row]; //선언하고자 하는 이차원 배열의 행의 수 만큼 동적 할당
for(int i = 0; i < row; i++) //각각의 인덱스에 선언하고자 하는 배열의 크기만큼을 가르키게 함.
arr[i] = new int[col];
출처 : https://ya-ya.tistory.com/101
3. 백준 결과 화면