https://www.acmicpc.net/problem/2422
문제
한윤정과 친구들은 이탈리아로 방학 여행을 갔다. 이탈리아는 덥다. 윤정이와 친구들은 아이스크림을 사먹기로 했다. 아이스크림 가게에는 N종류의 아이스크림이 있다. 모든 아이스크림은 1부터 N까지 번호가 매겨져있다. 어떤 종류의 아이스크림을 함께먹으면, 맛이 아주 형편없어진다. 따라서 윤정이는 이러한 경우를 피하면서 아이스크림을 3가지 선택하려고 한다. 이때, 선택하는 방법이 몇 가지인지 구하려고 한다.
입력
첫째 줄에 정수 N과 M이 주어진다. N은 아이스크림 종류의 수이고, M은 섞어먹으면 안 되는 조합의 개수이다. 아래 M개의 줄에는 섞어먹으면 안 되는 조합의 번호가 주어진다. 같은 조합은 두 번 이상 나오지 않는다. (1 ≤ N ≤ 200, 0 ≤ M ≤ 10,000)
N개의 종류의 아이스크림이 있는데 각 아이스크림마다 번호가 적혀있습니다.
어떤 종류의 아이스크림을 함께 먹으면, 맛이 굉장히 없어지는데, 이러한 경우를 피해서 아이스크림을 3가지 선택하려고 합니다.
이떄, 나올수 있는 방법이 총 몇가지 인지 구해야 합니다.
(1 ≤ N ≤ 200, 0 ≤ M ≤ 10,000)
N이 최대 200이기 떄문에 next_permutation으로 3개의 조합을 골라주었습니다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool not_mix[201][201];
vector<int> v;
vector<int> combinate;
int n,m;
void init(){
cin >> n >> m;
for(int i = 0;i<m;i++){
int a,b;
cin >> a >> b;
not_mix[a-1][b-1] = 1; //섞어 먹으면 안되는 조합
not_mix[b-1][a-1] = 1;
}
for(int i = 0;i<3;i++){ //3개만 선택할거임
combinate.push_back(1);
}
for(int i = 0;i<n-3;i++){
combinate.push_back(0);
}
sort(combinate.begin(),combinate.end());
}
int combinate_value(){
int cnt = 0;
do{
v.clear();
for(int i = 0;i<n;i++){
if(combinate[i] == 1){
v.push_back(i);
}
}
bool valid = false;
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
if(i != j){
if(not_mix[v[i]][v[j]] == 1){ //섞이면 안되는 조합이면 valid -> true
valid = true;
break;
}
}
}
if(valid == true){
break;
}
}
if(valid == false){ //섞여도 되는 경우 cnt++
cnt++;
}
}while(next_permutation(combinate.begin(),combinate.end()));
return cnt;
}
int main(void){
init();
cout << combinate_value();
}
'알고리즘' 카테고리의 다른 글
백준 10571 다이아몬드 C++ (0) | 2022.08.25 |
---|---|
백준 15661 링크와 스타트 C++ (0) | 2022.08.25 |
백준 3184 양 C++ (0) | 2022.08.23 |
백준 11578 팀원 모집 C++ (0) | 2022.08.23 |
백준 2866 문자열 잘라내기 C++ (0) | 2022.08.23 |