アルゴリズム::白準::DFS::1707:二分図
11056 ワード
質問する
質問へのアクセス
この問題の詳細はアルゴリズム::白準::DFS::1707::二分図(velog.io)にあります.今回はもっと効果的に同じ問題を解決します.
問題を理解する
解法
いずれの方法を使用しても、この問題は関係ありません.
0
未訪問、1
乙組A、2
乙組B仮定state[]
配列宣言.state
可x
の場合、次の頂点のstate
はい3-x
(1 → 2, 2 → 1) state
もしそうであれば二分図ではないと判断できる.コード#コード#
#include <iostream>
#include <vector>
using namespace std;
bool ans;
int K, V, E, state[20001];
vector<int> graph[20001];
void dfs(int cv, int s) {
state[cv] = s;
for (int nv : graph[cv]) {
// 방문하지 않은 정점에 대해 반대 그룹 표시
if (!state[nv]) dfs(nv, 3 - s);
// 방문된 정점에 대해 같은 그룹 여부 확인
if (state[nv] == state[cv]) { ans = true; break; }
}
}
void solve() {
// 모든 정점에 대해 dfs를 수행함.
for (int i = 1; i <= V; ++i) {
if (!state[i]) dfs(i, 1);
if (ans) break; // 이분그래프가 아닌 경우
}
}
void clear() {
ans = false;
fill(state, state + V + 1, false);
for (int i = 1; i <= V; ++i) graph[i].clear();
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> K;
while (K--){
cin >> V >> E;
int sv, ev;
for (int i = 0; i < E; ++i) {
cin >> sv >> ev;
// 무방향 그래프
graph[sv].push_back(ev);
graph[ev].push_back(sv);
}
solve();
ans ? cout << "NO\n" : cout << "YES\n";
clear(); // 다음 loop를 위한 초기화 과정
}
}
結果
Reference
この問題について(アルゴリズム::白準::DFS::1707:二分図), 我々は、より多くの情報をここで見つけました https://velog.io/@embeddedjune/알고리즘-백준-DFS-1707-이분-그래프-qfe7rrb7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol