Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- DP
- 다이나믹 프로그래밍
- 백트레킹
- multiset
- 캘리그라피
- 다음 지도 api
- Segment Tree
- BFS
- 비트마스크
- 성화봉송
- lower_bound
- 안드로이드 스튜디오
- 다음 API
- 창훈쓰다
- 외판원 순회
- 이분탐색
- MST
- yolo
- 삼성 코딩테스트
- 위상정렬
- upper_bound
- boj
- 영어회화 100일의 기적
- 인간이 그리는 무늬
- 평창동계올림픽
- 생활코딩
- 언어의 온도
- 성화봉송주자
- 그리디 알고리즘
- BOJ 2098
Archives
- Today
- Total
Hoon222y
[BOJ 1707] 이분 그래프 본문
이 문제를 풀기전에 이분그래프가 무엇인지 먼저 설명을 하도록 하겠다.
이분 그래프란 위 그림처럼 A,B처럼 반반으로 나눌수 있는 그래프를 말한다. 즉, 모든 간선의 끝이 한쪽은 A 한쪽은 B에 속하는 그래프를 말한다.
이분 그래프를 단순히 구현하는 문제가 바로 https://www.acmicpc.net/problem/1707 이다.
해당 문제의 경우 bfs혹은 dfs를 통하여 방문하는 지점의 점수를 각각 1,2로 다르게 준 후 마지막에 비교를 하면 된다. 그리하여
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 | #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> using namespace std; int T,v,e,a,b; int visited[22222]; bool ans; vector<vector<int>>vt ; void dfs(int node, int c){ visited[node] = c; if(vt[node].size() == 0){ ans = false; } for(int i=0;i<vt[node].size();i++){ int next = vt[node][i]; if(visited[next] == 0){ dfs(next,3-c); } } } int main(){ scanf("%d", &T); while(T--){ ans = true; scanf("%d%d" , &v, &e); vt.resize(v+1); for (int i=1; i<=v; i++) { vt[i].clear(); visited[i] = 0; } for(int i=1;i<=e;i++){ scanf("%d%d" , &a, &b); vt[a].push_back(b); vt[b].push_back(a); } for(int i=1;i<=v;i++){ if(visited[i] == 0){ dfs(i,1); } } for(int i=1;i<=v;i++){ for(int j=0;j<vt[i].size();j++){ if(visited[i] == visited[vt[i][j]]){ ans = false; } } } if(ans == true){ printf("YES\n"); }else{ printf("NO\n"); } vt.clear(); } return 0; } | cs |
해당 코드를 작성하였다. 하지만 결과는 fail.....
이 부분에서 이분 그래프에 대한 또 다른 정의?를 알 수 있다.이분 그래프는 예를들어 {1/3} , {2} 의 경우에도 이분 그래프라고 칭한다.
즉 16~18줄을 작성할 필요가 없는것이다. .... 따라서 그 부분을 제외하여 코딩을 하면 된다 .. ㅠㅠ
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 | #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> using namespace std; int T,v,e,a,b; int visited[22222]; bool ans; vector<vector<int>>vt ; void dfs(int node, int c){ visited[node] = c; for(int i=0;i<vt[node].size();i++){ int next = vt[node][i]; if(visited[next] == 0){ dfs(next,3-c); } } } int main(){ scanf("%d", &T); while(T--){ ans = true; scanf("%d%d" , &v, &e); vt.resize(v+1); for (int i=1; i<=v; i++) { vt[i].clear(); visited[i] = 0; } for(int i=1;i<=e;i++){ scanf("%d%d" , &a, &b); vt[a].push_back(b); vt[b].push_back(a); } for(int i=1;i<=v;i++){ if(visited[i] == 0){ dfs(i,1); } } for(int i=1;i<=v;i++){ for(int j=0;j<vt[i].size();j++){ if(visited[i] == visited[vt[i][j]]){ ans = false; } } } if(ans == true){ printf("YES\n"); }else{ printf("NO\n"); } vt.clear(); } return 0; } | cs |
'코딩 > BOJ & 알고스팟' 카테고리의 다른 글
[BOJ 11729] 하노이 탑 이동 순서 (1) | 2017.03.03 |
---|---|
[BOJ 10816] 숫자찾기2 - lower_bound, upper_bound, equal_range, multiset (0) | 2017.03.03 |
[BOJ 2156 ] - 포도주 시식 (3) | 2017.02.22 |
[12875] - 플로이드 머셜을 이용한 모든쌍의 최단경로 구하기 (0) | 2016.07.06 |
[12865] - LIS변형 DP활용 (0) | 2016.07.05 |
Comments