티스토리 뷰
문제
문제 링크: https://www.acmicpc.net/problem/1707
이분 그래프란?
☞모든 꼭짓점을 빨강과 파랑으로 색칠하되, 모든 변이 빨강과 파랑 꼭짓점을포함하도록 색칠 할수 있는 그래프.
▼ 이분 그래프의 예시
해당 문제는 주어지는 그래프가 이분 그래프인지를 확인하는 문제입니다.
예시를 보면 "하나의 정점에서 연결된 다른 정점들의 색상은 다르다" 인 것을 확인 할 수 있습니다.
이분 그래프의 특징을 이용하여 문제를 푸는 것이 핵심입니다.
DFS 혹은 BFS로 그래프를 탐색을 하여 이미 방문했던 정점을 확인할 때, 만약 자신과 같은 색상을 가지고 있다면
해당 그래프는 이분 그래프가 아닙니다.
코드
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 | #include <iostream> #include <vector> using namespace std; vector<int> G[20001]; int color[20001]; //1일때는 빨강, 2일때는 파랑, 0일때는 접근X void DFS(int node, int c){ color[node] = c; for(int i=0; i<G[node].size(); i++){ int next = G[node][i]; if(color[next]==0){ DFS(next, 3-c); //빨강 다음에는 파랑이여야하고 파랑 다음은 빨강이여야 함. //따락서 3-1 = 2, 3-2 = 1 } } } int main(){ int t; cin >> t; while (t--) { int n,m; cin >> n >> m; for(int i=1; i<=n; i++){ G[i].clear(); color[i]=0; } for(int i=0; i<m; i++){ int u,v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } for(int i=1; i<=n; i++){ if(color[i]==0){ DFS(i, 1); } } bool isBin=true; for(int i=1; i<=n; i++){ for(int j=0; j<G[i].size(); j++){ int k = G[i][j]; if(color[i]==color[k]) isBin=false; } } if(isBin) cout <<"YES"<<"\n"; else cout <<"NO"<<"\n"; } return 0; } | cs |
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
백준 14502: 연구소 (6) | 2018.01.18 |
---|---|
백준 2667: 단지번호 붙이기, 4963: 섬의 개수 (0) | 2018.01.13 |
백준 11052: 붕어빵 판매하기 (0) | 2018.01.06 |
백준 1463: 1로 만들기 (0) | 2018.01.05 |
백준 10799: 쇠막대기 (0) | 2017.08.15 |