백준의 ABCDE(13023) 문제이다.
( 문제 바로가기 )
[ 문제풀이 ]
1) 이 문제는 친구 관계가 성립하는 5명이 있으면, 1을 그게 안된다면 0을 출력하는 문제이다.
DFS를 통해서 쉽게 구현할 수 있다. 본인은 친구관계를 표시해주기 위해서 Vector를 사용했으며
a와 b가친구라면 V[a].push_back(b), V[b].push_back(a)를 해줌으로써 양방향으로 모두 친구관계를 성립하도록
입력을 저장해 주었다.
2) DFS의 구현방법은 어렵지 않다. 모든 정점(모든 사람의 번호)에서 시작을 하면서, 아직 탐색하지 않은 친구관계인 사람을
찾아가면서, DFS를 계속해서 호출해준다. DFS의 종료는 총 사람이 5명이 되면 종료를 시키면 된다.
[ 소스코드 ]
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include<iostream> #include<cstring> #include<vector> #define endl "\n" #define MAX 2000 using namespace std; int N, M; bool Visit[MAX], Answer; vector<int> V[MAX]; void Input() { cin >> N >> M; for (int i = 0; i < M; i++) { int a, b; cin >> a >> b; V[a].push_back(b); V[b].push_back(a); } } void DFS(int Idx, int Cnt) { if (Cnt == 5) { Answer = true; return; } Visit[Idx] = true; for (int i = 0; i < V[Idx].size(); i++) { int Next = V[Idx][i]; if (Visit[Next] == true) continue; DFS(Next, Cnt + 1); if (Answer == true) return; } Visit[Idx] = false; } void Solution() { for (int i = 0; i < N; i++) { memset(Visit, false, sizeof(Visit)); DFS(i, 1); if (Answer == true) break; } if (Answer == true) cout << 1 << endl; else cout << 0 << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 1890 ] 점프 (C++) (1) | 2019.01.28 |
---|---|
[ 백준 15649 , 15650 ] N과M(1) , N과M(2) (C++) (0) | 2019.01.28 |
[ 백준 9251 ] LCS (C++) (3) | 2019.01.28 |
[ 백준 11722 ] 가장 긴 감소하는 부분수열 (C++) (0) | 2019.01.28 |
[ 백준 14888 ] 연산자 끼워넣기 (C++) (0) | 2019.01.28 |