※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 10976번 문제인 피난이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/10976
10976번: 피난
어느 날, CC동산에 놀러온 초등학생 석주가 CC동산에 무차별적으로 침을 뱉었다. CC동산 일대에서 열심히 일하던 개미들의 90%가 석주의 침 때문에 몰살당했고, 소수 개미와 1000마리의 여왕개미만
www.acmicpc.net
문제 조건에 따라 체크포인트를 노드로 하고 길을 방향이 있는 에지로 하는 그래프를 그리면 체크포인트 1에서 체크포인트 N으로 가는 그래프(DAG)를 얻을 수 있다.
이 그래프에서 출발점과 도착점을 각각 source와 sink로 보고, source 또는 sink와 연결된 간선의 가중치를 1로, 나머지 에지의 가중치를 INF로 하고 source에서 sink로 가는 maximum flow를 계산하면 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int source = 1, sink;
vector<int> G[201];
int edge[201][201];
int level[201];
bool bfs() {
memset(level, 0, sizeof(level));
level[source] = 1;
queue<int> que;
que.push(source);
while (!que.empty()) {
int current = que.front(); que.pop();
for (auto node : G[current]) {
if (edge[current][node] && level[node] == 0) {
level[node] = level[current] + 1;
que.push(node);
}
}
}
return level[sink];
}
int turn[201];
int dfs(int current, int flow) {
if (current == sink) return flow;
int gcursize = G[current].size();
for (int& i = turn[current]; i < gcursize; i++) {
int node = G[current][i];
if (edge[current][node] && level[node] == level[current] + 1){
int f = dfs(node, min(flow, edge[current][node]));
if (f) {
edge[current][node] -= f;
edge[node][current] += f;
return f;
}
}
}
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) {
memset(edge, 0, sizeof(edge));
int N, M; cin >> N >> M;
sink = N;
while (M--) {
int x, y; cin >> x >> y;
if (x > y) swap(x, y);
G[x].emplace_back(y);
G[y].emplace_back(x);
if (x == 1 || y == N) edge[x][y] = 1;
else edge[x][y] = 1000000007;
}
int ans = 0;
while (bfs()) {
memset(turn, 0, sizeof(turn));
int f;
while (f = dfs(source, 1000000007)) ans += f;
}
cout << ans << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1536 // C++] Dance, Dance (0) | 2022.01.03 |
---|---|
[BOJ 17400 // C++] 깃발춤 (0) | 2022.01.02 |
[BOJ 1739 // C++] 도로 정비하기 (0) | 2021.12.31 |
[BOJ 3747 // C++] 완벽한 선거! (0) | 2021.12.30 |
[BOJ 23237 // C++] How Many Subtrees? (0) | 2021.12.29 |