baekjoon

[백준] 17412 도시 왕복하기 1

윤만석 2023. 2. 6. 11:54

문제

N개의 도시가 P개의 단방향 길로 연결되어 있다. 이석원은 1번 도시와 2번 도시 사이를 가며 워해머를 한다. 성실한 이석원은 1번에서 2번으로 가는 서로 다른 경로를 최대한 많이 찾으려고 하는데, 이때 한 경로에 포함된 길이 다른 경로에 포함되면 안된다. 입력에는 1번 도시와 2번 도시를 연결하는 길은 없다. 도시의 번호는 1번부터 N번까지이다.

입력

첫째 줄에 두 정수 N(3 ≤ N ≤ 400), P(1 ≤ P ≤ 10,000)이 주어진다. 다음 P개의 줄에는 각 길이 연결하는 출발 도시와 도착 도시의 번호가 주어지며, 두 번호는 다르다.

출력

1번에서 2번으로 가는 서로 다른 경로의 최대 개수를 출력한다.

 

 

1번에서 2번으로 가는 서로 다른 경로의 최대 개수를 구해야 합니다.

최대 유량 알고리즘을 사용합니다.

#include<bits/stdc++.h>

using namespace std;
typedef pair<int, int> pi;
int c[401][401], f[401][401], N, P, ans;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int from, to;
	cin >> N >> P;
	while (P--) {
		cin >> from >> to;
		c[from][to] = 1;  //단방향 간선 그래프
	}
	while (1) {  
		vector<int>parent(400, 0);
		queue<int>q;
		parent[1] = 1;
		q.push(1);
		while (!q.empty()) {//BFS 수행
			int here = q.front();
			q.pop();

			for (int there = 1; there <= N; there++) {
				if (c[here][there] - f[here][there] > 0 && !parent[there]) { 최대 유량 알고리즘
					q.push(there);
					parent[there] = here;
				}
			}
		}
		if (parent[2] == 0)break;

		for (int p = 2; p != 1; p = parent[p]) {
			f[parent[p]][p] = 1;
			f[p][parent[p]] = -1;
		}
		ans++;
	}
	cout << ans;
}