1707번: 이분 그래프
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수
www.acmicpc.net
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
vector<int> a[20001];
int color[20001];
void dfs(int node, int c) {
color[node] = c;
for (int i=0; i<a[node].size(); i++) {
int next = a[node][i];
if (color[next] == 0) {
dfs(next, 3-c);
}
}
}
int main() {
int t;
scanf("%d\n",&t);
while (t--) {
int n, m;
scanf("%d %d",&n,&m);
for (int i=1; i<=n; i++) {
a[i].clear();
color[i] = 0;
}
for (int i=0; i<m; i++) {
int u,v;
scanf("%d %d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
for (int i=1; i<=n; i++) {
if (color[i] == 0) {
dfs(i, 1);
}
}
bool ok = true;
for (int i=1; i<=n; i++) {
for (int k=0; k<a[i].size(); k++) {
int j = a[i][k];
if (color[i] == color[j]) {
ok = false;
}
}
}
printf("%s\n",ok ? "YES" : "NO");
}
return 0;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
vector<int> a[20001];
int color[20001];
bool dfs(int node, int c) {
color[node] = c;
for (int i=0; i<a[node].size(); i++) {
int next = a[node][i];
if (color[next] == 0) {
if (dfs(next, 3-c) == false) {
return false;
}
} else if (color[next] == color[node]) {
return false;
}
}
return true;
}
int main() {
int t;
scanf("%d\n",&t);
while (t--) {
int n, m;
scanf("%d %d",&n,&m);
for (int i=1; i<=n; i++) {
a[i].clear();
color[i] = 0;
}
for (int i=0; i<m; i++) {
int u,v;
scanf("%d %d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
bool ok = true;
for (int i=1; i<=n; i++) {
if (color[i] == 0) {
if (dfs(i, 1) == false) {
ok = false;
}
}
}
printf("%s\n",ok ? "YES" : "NO");
}
return 0;
}
'Problem set' 카테고리의 다른 글
[백준] 4963 섬의 개수 (0) | 2021.02.20 |
---|---|
[백준] 2667 단지번호붙이기 (0) | 2021.02.20 |
[백준] 11724 연결 요소의 개수 (0) | 2021.02.20 |
[백준] 1260 DFS와 BFS (0) | 2021.02.20 |
[백준] 13023 ABCDE (0) | 2021.02.20 |