본문 바로가기
Solved.ac/Class 7

[BOJ] 백준 1017번: 소수쌍

by 강성주의 알고리즘 2020. 6. 17.

소수 = 홀수 + 짝수의 조합으로만 가능한 아이디어를 시작으로

홀수와 짝수를 두 개의 그룹으로 나눠, 시작하는 수의 짝을 고정하여 이분매칭을 반복하는 문제

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
using namespace std;
typedef long long ll;
bool s[2001] = { 0, };
int arr[1001];
int ma[1001];
int curd;
bool visit[1001];
int _lsize, _rsize;
vector<int> l, r;
bool dfs(int node) {
	if (visit[node]) return false;
	visit[node] = true;
	for (int i = 0; i < _rsize; i++) {
		if (i != curd && !s[l[node]+r[i]]) { // 지정 x , 소수 
			if (-1 == ma[i] || dfs(ma[i])) {
				ma[i] = node;
				return true;
			}
		}
	}
	return false;
}
int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
	s[0] = 1;
	s[1] = 1;
	for (int i = 2; i < 2001; i++) {
		if (!s[i]) {
			for (int j = i + i; j < 2001; j += i) {
				s[j] = 1;
			}
		}
	}
	int n;
	cin >> n;
	int start;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	start = arr[0];
	if (start & 1) {
		for (int i = 0; i < n; i++) {
			if (arr[i] & 1) {
				l.push_back(arr[i]);
			}
			else {
				r.push_back(arr[i]);
			}
		}
	}
	else {
		for (int i = 0; i < n; i++) {
			if (arr[i] & 1) {
				r.push_back(arr[i]);
			}
			else {
				l.push_back(arr[i]);
			}
		}
	}
	_rsize = r.size();
	_lsize = l.size();
	if (_lsize != _rsize) {
		cout << -1;
		return 0;
	}
	sort(r.begin(), r.end());
	int flag = 0;
	for (int i = 0; i < _rsize; i++) {
		if (!s[l[0] + r[i]]) {
			memset(ma, -1, sizeof(ma));
			curd = i;
			ma[i] = 0;
			int ans = 1;
			for (int j = 1; j < _lsize; j++) {
				memset(visit, 0, sizeof(visit));
				if (dfs(j)) {
					ans += 1;
				}
			}
			if (ans == _lsize) {
				flag = 1;
				cout << r[i] << " ";
			}
		}
	}
	if (!flag) {
		cout << "-1";
	}

}

 

반응형

'Solved.ac > Class 7' 카테고리의 다른 글

[BOJ] 백준 13537번: 수열과 쿼리 1  (0) 2020.06.22
[BOJ] 백준 11408번: 열혈강호 5  (0) 2020.06.22