unagi11
이국의 보조기억장치
unagi11
전체 방문자
오늘
어제
  • 전체 글 (35)
    • Technology (28)
      • Algorithm Theory (10)
      • Problem Solving (14)
      • Unreal (1)
      • Unity (1)
      • Cocos2d (0)
      • etc (2)
    • Develop (5)
      • Dungeon-Chess (0)
      • Past Projects (3)
      • etc (2)
    • Daily (2)

블로그 메뉴

  • 깃허브
  • 프로필

인기 글

최근 글

hELLO · Designed By 정상우.
unagi11

이국의 보조기억장치

Technology/Problem Solving

[BOJ] 18138번: 리유나는 세일러복을 좋아해

2022. 7. 25. 00:00
 

18138번: 리유나는 세일러복을 좋아해

너비가 3인 티셔츠와 너비가 2인 세일러 카라를 붙이고, 너비가 5인 티셔츠에 너비가 5인 세일러 카라를 붙이고 너비가 7인 티셔츠에 너비가 4인 세일러 카라를 붙이고 너비가 10인 티셔츠에 너비

www.acmicpc.net

제한 조건
- 시간 제한 : 1s
- 공간 제한 : 256MB

풀이 사용 
- 사용 언어 : C++17
- 사용 시간 : 0ms
- 사용 공간 : 1232KB

풀이 설명
- DFS를 이용한 이분매칭에서 셔츠와 카라를 연결하는 조건을 만들어줘야하는 문제
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX 201 // 카라와 티셔츠의 최대개수

vector<int> vt[MAX];

int match[MAX];
bool visited[MAX];

int numOfShirts, numOfKaras;

bool dfs(int a)
{
    if (visited[a])
        return false;

    visited[a] = true;

    for (int b : vt[a])
        if (match[b] == -1)
        {
            match[b] = a;
            return true;
        }

    for (int b : vt[a])
        if (dfs(match[b]))
        {
            match[b] = a;
            return true;
        }

    return false;
}

int main(int argc, char const *argv[])
{
    scanf("%d %d", &numOfShirts, &numOfKaras);

    vector<int> shirts;
    for (int i = 0; i < numOfShirts; i++)
    {
        int temp;
        scanf("%d", &temp);
        shirts.push_back(temp);
    }

    vector<int> karas;
    for (int i = 0; i < numOfKaras; i++)
    {
        int temp;
        scanf("%d", &temp);
        karas.push_back(temp);
    }

    for (int i = 0; i < numOfShirts; i++)
    {
        for (int j = 0; j < numOfKaras; j++)
        {
            if (karas[j] * 2 >= shirts[i] && karas[j] * 4 <= shirts[i] * 3)
                vt[i].push_back(j);
            else if (karas[j] >= shirts[i] && karas[j] * 4 <= shirts[i] * 5)
                vt[i].push_back(j);
        }
    }

    int count = 0;
    fill(match, match + MAX, -1);
    for (int i = 0; i < numOfShirts; i++)
    {
        fill(visited, visited + MAX, false);
        if (dfs(i))
            count++;
    }

    printf("%d", count);

    return 0;
}
 

[Algorithm] 최대 이분 매칭 문제

문제 Given a bipartite undirected graph G=(XUY, E), find the maximum-cardinality matching M*. 주어진 이분 비방향 그래프 G에서 (중복되지 않는) 최대 매칭 집합크기를 구해라. Matching이란? A subset M of..

unagi11.tistory.com

저작자표시 변경금지
    'Technology/Problem Solving' 카테고리의 다른 글
    • [BOJ] 6086번: 최대 유량
    • [BOJ] 1162번: 도로포장
    • [BOJ] 1738번: 골목길
    • [BOJ] 2152번: 여행 계획 세우기
    unagi11
    unagi11
    개발하고 기록하자

    티스토리툴바