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

 

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

어느 날 모든 학생들은 한 명이 한개의 노트북을 가지고 공부하던 도중, 자리를 바꾸다가 그만 노트북이 뒤섞이고 말았다. 대다수의 학생들은 자신의 노트북을 잘 알고 있어서 자신의 노트북을 받을 수 있었지만, 애석하게도 N명의 학생들이 정확히 자신의 노트북이 어떤것인지 알지 못했다. 왜냐하면 그들은 노트북을 구입한게 바로 어제였기 때문이다. 어차피 새것인 노트북, 바뀐들 어떠하랴. 그들에게 자신의 노트북이라고 생각되는 노트북들을 얘기해 보라고 했다. 이번에는

www.acmicpc.net


문제해설

각 시작 노드 ( 사람 ) 에서

노트북 주인이 없다면 flow를 발생시켜서

노트북을 갖게 하면 됩니다.


전체코드

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define endl '\n'
//--------------------------------------------------------------------------------------

#define MAX_N 101

vector<int> map[MAX_N];
int occupy[MAX_N];
int occupied[MAX_N];
bool visit[MAX_N];
bool dfs(int x) {
	visit[x] = true;
	for (int i = 0; i < map[x].size(); i++) {
		int y = map[x][i];
		if (occupied[y] == -1 || (!visit[occupied[y]] && dfs(occupied[y]))) {
			occupy[x] = y;
			occupied[y] = x;
			return true;
		}
	}
	return false;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int N, M; cin >> N >> M;
	for (int i = 0; i < M; i++) {
		int a, b; cin >> a >> b;
		map[a].push_back(b);
	}
	memset(occupy, -1, sizeof(occupy));
	memset(occupied, -1, sizeof(occupied));
	int ans = 0;
	for (int i = 1; i <= N; i++) {
		if (occupy[i] == -1) {
			memset(visit, false, sizeof(visit));
			if (dfs(i)) ans++;
		}
	}
	cout << ans << endl;
}

기타

'알고리즘 > [C++]BOJ' 카테고리의 다른 글

[백준BOJ] 2261 가장 가까운 두 점  (1) 2019.10.19
[백준BOJ] 11377 열혈강호 3  (0) 2019.10.14
[백준BOJ] 1671 상어의 저녁식사  (0) 2019.10.14

+ Recent posts