공부공간

BOJ - 1298 ) 노트북의 주인을 찾아서 본문

알고리즘/이분 매칭

BOJ - 1298 ) 노트북의 주인을 찾아서

개발자가될수있을까? 2020. 8. 30. 17:36

 


https://www.acmicpc.net/problem/1298

 

1298번: 노트북의 주인을 찾아서

어느 날 모든 학생들은 한 명이 한개의 노트북을 가지고 공부하던 도중, 자리를 바꾸다가 그만 노트북이 뒤섞이고 말았다. 대다수의 학생들은 자신의 노트북을 잘 알고 있어서 자신의 노트북을

www.acmicpc.net


이분 매칭의경우 네트워크플로우에서 최대유량이 1인간선으로 이루어진 네트워크중 A/B집합 두개로

 

나뉘어서 최대유량을 구하는 문제이다.

 

하지만 에드몬드카프로 구현하기보다는 DFS를 활용하여, 앞선 매칭을 바꿀수있는지? 에대한 재귀함수를

 

정의한다.

 

이해가 안되면 아래 강의를 추천한다. 

 

뭔가 이분매칭의경우, "두 집합간 최대한 매칭을 시킨다" 라는 느낌이 온다.

 

https://blog.naver.com/ndb796/221240613074

 

29. 이분 매칭(Bipartite Matching)

지난 번에 네트워크 플로우(Network Flow) 알고리즘에 대해 공부하는 시간을 가졌습니다. 이번 시간에는 ...

blog.naver.com

 


 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

class Main {
  public static int m,n,result[];
  public static boolean check[];
  public static ArrayList<Integer> node[];
  public static void main(String[] args) throws Exception {
  
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    n = Integer.parseInt(st.nextToken());
    m = Integer.parseInt(st.nextToken());
    
    node = new ArrayList[n+1];
   
    result = new int[n+1];
    for(int i = 1 ; i <= n ; i++){node[i] = new ArrayList<>();}
    for(int i = 0 ; i < m ; i ++){
      st = new StringTokenizer(br.readLine());
      int s = Integer.parseInt(st.nextToken());
      int num = Integer.parseInt(st.nextToken());
      node[s].add(num);
    }

    int answer =0;
    for(int i = 1 ; i <= n ; i++){
      check = new boolean[n+1];
      if(bipartiteMatching(i)){
        answer++;
      } 
    }
    System.out.print(answer);
  }

  public static boolean bipartiteMatching(int x){
    
    for(int i = 0 ; i < node[x].size() ; i++){
      // 원하는 집
      int want = node[x].get(i);
      if(!check[want]){
        // 방문안했다면 방문처리 해주어 중복방지
        check[want] = true;
        if(result[want]==0 || bipartiteMatching(result[want])){
          result[want] = x;
          return true;
        }
      }
    }

    return false;
  }
}

'알고리즘 > 이분 매칭' 카테고리의 다른 글

BOJ - 11375 ) 열혈강호  (0) 2020.09.01
BOJ - 2188 ) 축사배정  (0) 2020.08.31
Comments