Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 임베디드 딥러닝
- 삼성역량테스트
- 다이나믹프로그래밍
- sort
- 삼성역테
- 딥러닝
- 포스코 교육
- 초소형머신러닝
- TensorFlow Lite
- 삼성코딩테스트
- tinyml
- 코테
- dfs문제
- dfs
- bfs문제
- 그리디
- 알고리즘
- 영상처리
- BFS
- 코딩테스트
- MCU 딥러닝
- DP문제
- tflite
- 코테 문제
- DP
- 자료구조
- 삼성코테
- 포스코 ai 교육
- 포스코 AI교육
- 컴퓨팅사고
Archives
- Today
- Total
코딩뚠뚠
[백준문제풀이] 1707 이분그래프 본문
반응형
풀이일시 : 2020-10-10
문제 :
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
입력 :
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 E(1≤E≤200,000)가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호가 빈 칸을 사이에 두고 주어진다.
ex)
2 //테스트케이스 수
3 2 //정점, 간선
1 3 //간선정보1
2 3 //간선정보2
4 4 //정점, 간선
1 2 //간선정보1
2 3 //간선정보2
3 4 //간선정보3
4 2 //간선정보4
출력 :
K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.
ex)
YES
NO
풀이 :
- visit을 빨강 1 파랑 2로 두어 구분해준다.
- BFS로 풀이한다.
#include <iostream>
#include <queue>
#include <vector>
#include <string.h>
#define MAX 20001
using namespace std;
vector <int> v[MAX];
int visit[MAX]; //여기다가 0,1 뿐만이아니라 방문X:0 빨강:1 파랑:2 로 표시
int result;
int K, V, E;
void bfs(int x, int y) {
queue <int> q;
visit[x] = y; //RED로 초기화
q.push(x);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < v[x].size(); i++) { //인접 중에
int z = v[x][i];
if (visit[z] == 0) { //방문하지 않은 것 중
if (visit[x] == 1) { //빨간색이면
visit[z] = 2; //파란색으로 넣기
q.push(z); //큐에넣기
}
else if (visit[x] == 2) { //파란색이면
visit[z] = 1; //빨간색으로 넣기
q.push(z);
}
}
}
}
}
bool isBipartiteGraph() { //이분그래프인가?!
for (int i = 1; i <= V; i++) {
for (int j = 0; j < v[i].size(); j++) { //빠져나온 후 모든경우에 대해 탐색
int z = v[i][j];
if (visit[i] == visit[z]) {
return 0;
}
}
}
return 1;
}
int main() {
int re;
cin >> K;
for (int i = 0; i < K; i++) {
cin >> V >> E;//노드의 수 , 간선의 수
for (int i = 0; i < E; i++) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
for (int i = 1; i <= V; i++) { //노드를 살펴본다.
if (visit[i] == 0) { //색이 칠해져있지 않은 노드만 따져본다.
bfs(i, 1); //빨간색:1 부터 칠하고 시작한다.
}
}
if (isBipartiteGraph()) {
printf("YES\n");
}
else {
printf("NO\n");
}
for (int i = 0; i < MAX; i++) {
v[i].clear(); //한번 수행후엔 벡터를 다 비워줘야 함
}
memset(visit, 0, sizeof(visit)); //방문, 색 나타낸 배열도 비워주기
}
return 0;
}
추가자료 :
반응형
'알고리즘 문제풀이 > 백준문제풀이' 카테고리의 다른 글
[백준문제풀이] 11724 연결 요소의 개수 (0) | 2021.01.01 |
---|---|
[백준문제풀이] 1260 DFS와 BFS (0) | 2020.12.31 |
[백준문제풀이] 1992 쿼드트리 (0) | 2020.12.31 |
[백준문제풀이] 1074 Z (0) | 2020.12.31 |
[백준문제풀이] 4673 셀프 넘버 (0) | 2020.12.31 |