티스토리 뷰

반응형

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

 

11960번: Max Flow

Farmer John has installed a new system of \(N-1\) pipes to transport milk between the \(N\) stalls in his barn (\(2 \leq N \leq 50,000\)), conveniently numbered \(1 \ldots N\). Each pipe connects a pair of stalls, and all stalls are connected to each-other

www.acmicpc.net

 

  • 필요한 배경지식

최소 공통 조상(LCA), 트리에서의 다이나믹 프로그래밍

 

 

  • 문제 해결 방법

이전에 포스팅한 농장 관리 문제에서 풀이한 방법과 같은 방법을 이용하여 특정 헛간에서 펌핑된 우유의 양을 구할 수 있습니다.

 

농장 관리 문제와 다른점은 간선이 아니라 노드에 값이 더해져야 한다는 것과

업데이트가 모두 이루어진 후 결과값을 출력하기 때문에, 노드에 추가되는 가중치를 배열에 누적하여 저장하고 DP로 문제를 해결할 수 있습니다.

 

 

 

 

  • C++ 전체 코드
#include<bits/stdc++.h>
#define MAX 50000
using namespace std;

int N, M;
int ac[MAX+1][21]{};
int dpt[MAX+1]{};
vector<int> adj[MAX+1]{};
int cnt[MAX+1]{};

int num = 0;
void dfs(int now, int parent) {
    dpt[now] = dpt[parent] + 1;
    ac[now][0] = parent;

    for (int i = 1; i <= 20; i++)
        ac[now][i] = ac[ac[now][i-1]][i-1];

    for (auto next : adj[now]) {
        if (next == parent) continue;
        dfs(next, now);
    }
}

int lca(int x, int y) {
    if (dpt[x] > dpt[y]) swap(x, y);
    for (int i = 20; i >= 0; i--) { 
        if (dpt[y] - dpt[x] >= (1 << i)) 
            y = ac[y][i];
    }
    if (x == y)return x;
    for (int i = 20; i >= 0; i--) {
        if (ac[x][i] != ac[y][i]) {
            x = ac[x][i];
            y = ac[y][i];
        }
    }
    return ac[x][0];
}

void dfs2(int now, int par){
    for(auto &i : adj[now]){
        if(i != par) dfs2(i, now), cnt[now] += cnt[i];
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>N>>M;
    int a,b;
    for(int i=1; i<N; i++){
        cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    dfs(1, 0);

    while(M--){
        cin>>a>>b;
        int l = lca(a,b);
        cnt[a]++;
        cnt[b]++;
        cnt[l]--;
        cnt[ac[l][0]]--;
    }

    dfs2(1, 0);
    cout << *max_element(cnt + 1, cnt + N + 1);
}

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함