이분 그래프
https://www.acmicpc.net/problem/1707
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
푸는 법
알고리즘 검색하다 보면 꼭 나오는 이 분의 블로그를 보고 그냥 이대로만 하면 맞을 수 있다.
주의할 점은 테스트 케이스를 실행할 때마다 그래프와 체크를 초기화해주는 것이다.
나는 DFS로 풀었고, 만약 start의 색깔과 next의 색깔이 이미 존재하고(둘다 방문했고) 색깔이 같으면 재귀문을 빠져나와 answer이 NO가 되도록 했다.
코드
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 | #include <iostream> #include <algorithm> #include <vector> #define red 1 #define blue 2 using namespace std; string answer; void dfs(vector<int> graph[], int check[], int start) { for(int i=0; i<graph[start].size(); i++) { int next=graph[start][i]; if(check[start]!=0&&check[next]!=0&&check[start]==check[next]) { answer="NO"; break; } if(check[next]==0) { check[next]=red; if(check[start]==red){ check[next]=blue; } dfs(graph, check, next); } } } int main() { int K; scanf("%d", &K); while(K>0) { int V, E; scanf("%d %d", &V, &E); vector<int> graph[20001]; int check[20001]={0,}; for(int i=0; i<E; i++) { int a, b; scanf("%d %d", &a, &b); graph[a].push_back(b); graph[b].push_back(a); } answer="YES"; for(int i=1; i<=V; i++) { if(check[i]==0) { check[i]=red; dfs(graph, check, i); } } cout<<answer<<"\n"; K--; } return 0; } | cs |
메모리가 조금 깔끔하지 못하게 나온 것 같긴 한데 일단 맞았다.
정답률 21%은 아마 초기화를 하지 않은 코드에서 나온 것 같다.
'PS' 카테고리의 다른 글
백준 1012번 C++ 유기농 배추 (0) | 2019.06.12 |
---|---|
백준 4963번 C++ 섬의 개수 (0) | 2019.06.12 |
백준 11004번 C++ K번째 수 (0) | 2019.06.10 |
백준 10824번 C++ 네 수 (0) | 2019.06.07 |
백준 2225번 C++ 합분해 (0) | 2019.06.02 |
댓글