[規格]1707二分図C++(BFS、DFS)
📌白駿1707二分図
https://www.acmicpc.net/problem/1707
前回は隣接行列を使ったことがありますが、今回は隣接表を使いましょう.
今回は訪問の表示をしないで、色を付けます.赤にRED(2)、青にBLUE(3)を加える.の隣接リスト、アクセス記録、ノード数、幹線数を全域に発表します.隣接テーブルはベクトルで作られています. main()はテスト例を入力し、各テスト例はノード数、幹線数、ノード数を入力します.そして、隣接リスト に入れる
1. DFSアクセスのために1からNまですべて返され、アクセスレコードを持つ DFSのみが返される最初のアクセスの場合は、アクセスレコードにREDを追加します.
接続点 を探しに行きますが、接続点もアクセスしたことがありませんか?じゃ、ここで条件を決めてあげます.ナビゲーション開始ノードがREDである場合、接続点にBLUEが挿入され、BLUEである場合にREDが挿入される. および要素別アクセス.この操作を繰り返す(戻る) 2. BFSキューを作成し、開始キューでpush キューの一番前の値をコピーし、CUPOP をコピーします.キューの一番前の値はREDですか?隣接リストに接続されているすべてのノードをBLUEに入れる.(BLUEはRED) check()関数を使用して二分図検査を行います.隣接ノードと開始ノードの色が同じである場合、この図X.同じノードがある場合、 に戻る.には重要なものもあります.この問題はテストケースがあるため,隣接表とアクセス記録を複数回記入する必要がある.このため、memsetを使用して初期化する必要があります. DFSプール
https://www.acmicpc.net/problem/1707
前回は隣接行列を使ったことがありますが、今回は隣接表を使いましょう.
今回は訪問の表示をしないで、色を付けます.赤にRED(2)、青にBLUE(3)を加える.
1. DFS
接続点
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
#define RED 2
#define BLUE 3
vector<int> vect[20001]; //인접리스트
int visited[20001]; //방문기록
int V, E;
/* DFS 실행 */
void DFS(int start)
{
//방문안한 점이면 RED
if (visited[start] == 0)
visited[start] = RED;
//연결된 점들 방문
for (int i = 0; i < vect[start].size(); i++)
{
int idx = vect[start][i];
if (visited[idx] == 0) //방문 안한 점이면
{
//요소에 방문기록 남김(색칠하기)
if (visited[start] == RED)
visited[idx] = BLUE;
else if (visited[start] == BLUE)
visited[idx] = RED;
//요소별로 방문
DFS(idx);
}
}
}
/* 이분그래프 검사 */
int check()
{
//인접한 노드와 색이 같으면 이분그래프 X
for (int i = 1; i <= V; i++)
{
//연결된게 자기자신 뿐일 경우엔 size가 0이라서 돌아가지 않는다.
for (int j = 0; j < vect[i].size(); j++)
{
int idx = vect[i][j];
if (visited[i] == visited[idx])
{
return false;
}
}
}
return true;
}
int main()
{
int T; //테스트케이스
int u, v; //노드 담을 변수
cin >> T;
while (T--)
{
cin >> V >> E;
for (int i = 0; i < E; i++)
{
cin >> u >> v;
vect[u].push_back(v);
vect[v].push_back(u);
}
//빠짐없이 방문하기 위해 1부터 원소 개수까지 다 방문해봄
for (int i = 1; i <= V; i++)
{
if (visited[i] == 0)
DFS(i);
}
if (check() == 0) //이분그래프인지 검사
cout << "NO\n";
else
cout << "YES\n";
memset(visited, 0, sizeof(visited));
memset(vect, 0, sizeof(vect));
}
}
BFSプール#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
#define RED 1
#define BLUE 2
vector<int> vect[20001];
int visited[20001];
int V, E;
void BFS(int start)
{
visited[start] = RED;
queue<int> q;
q.push(start);
while(q.size()!=0) //큐가 빌 때 까지 반복(전체)
{
int now = q.front();
q.pop();
for(int i=0; i<vect[now].size(); i++)
{
if(visited[vect[now][i]] == 0)
{
q.push(vect[now][i]);
if(visited[now] == RED) visited[vect[now][i]] = BLUE;
else if(visited[now] == BLUE) visited[vect[now][i]] = RED;
}
}
}
}
bool check()
{
for (int i = 1; i <= V; i++)
{
for (int j = 0; j < vect[i].size(); j++)
{
if (visited[i] == visited[vect[i][j]])
return false;
}
}
return true;
}
int main()
{
int K, u, v;
cin >> K;
while (K--)
{
cin >> V >> E;
for (int i = 0; i < E; i++)
{
cin >> u >> v;
vect[u].push_back(v);
vect[v].push_back(u);
}
//빠짐없이 방문하기 위해 노드 개수만큼 BFS 돌려줘야함
for (int i = 1; i <= V; i++)
{
if (visited[i] == 0)
{
BFS(i);
}
}
//이분그래프 검사
if (check())
cout << "YES\n";
else
cout << "NO\n";
memset(visited, 0, sizeof(visited));
memset(vect, 0, sizeof(vect));
}
}
Reference
この問題について([規格]1707二分図C++(BFS、DFS)), 我々は、より多くの情報をここで見つけました https://velog.io/@matcha_/백준-1707-이분그래프-C-BFS-DFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol