[BOJ 26972] Barn Tree

2023. 2. 5. 13:56Baekjoon

728x90

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

 

26972번: Barn Tree

Farmer John's farm has $N$ barns ($2 \leq N \leq 2\cdot 10^5$) numbered $1 \dots N$. There are $N-1$ roads, where each road connects two barns and it is possible to get from any barn to any other barn via some sequence of roads. Currently, the $j$th barn h

www.acmicpc.net

 

- 문제 요약

 

Farmer John의 농장에는 건초가 들어있는 N개의 헛간이 있습니다. N개의 헛간에는 1~N까지 번호가 붙어있습니다.

또한, 두 개의 헛간을 이어주는 길이 N-1개 있습니다.

John은 N개의 헛간에 들어있는 건초의 수를 동일하게 만들고 싶어 합니다.

헛간과 헛간을 이어주는 길을 통해 건초를 옮길 수 있습니다.

현재 헛간에 있는 건초 수보다 작거나 같은 수의 건초만 옮길 수 있습니다.

가능한 최소 주문 수로 작업을 완료하기 위해 Farmer John이 말할 수 있는 주문을 각 줄에 출력하세요.

 

 

- 알고리즘 정리

 

dfs 활용으로 풀면 되는 문제입니다. up으로 그래프 순회 한 번 하고, down으로 순회 한 번 하면서 과정 중에 얻는 주문을 ans 벡터에 넣어줍니다. (ans 벡터의 사이즈와 값을 출력하면 풀이 완료)

 

 

- 코드 작성

 

#include<bits/stdc++.h>
#include<tuple>
using namespace std;

#define MAX 200005
typedef long long ll;
int n,di[4]={0,-1,0,1},dj[4]={-1,0,1,0};
ll avg,h[MAX],sum[MAX],sz[MAX];
vector<int>v[MAX];
vector<tuple<int,int,ll>>ans;

void dfs_up(int x,int p){
    sz[x]=1;
    sum[x]=h[x];
    for(auto &i:v[x]){
		if(i!=p){
	        dfs_up(i,x);
	        sum[x]+=sum[i];
	        sz[x]+=sz[i];
	    }
    }
    if(x!=1&&sum[x]>avg*sz[x]){
        ans.push_back({x,p,sum[x]-avg*sz[x]});
        sum[p]+=sum[x]-avg*sz[x];
        sum[x]-=sum[x]-avg*sz[x];
    }
}

void dfs_down(int x,int p){
    for(auto &i:v[x]){
		if(i!=p){
	        if(sum[i]<avg*sz[i]){
	            ans.push_back({x,i,avg*sz[i]-sum[i]});
	            sum[x]-=avg*sz[i]-sum[i];
	            sum[i]+=avg*sz[i]-sum[i];
	        }
	        dfs_down(i,x);
    	}
    }
}

int main(){
    ios::sync_with_stdio(false);
	cin.tie(NULL);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>h[i];
        avg+=h[i];
    }
    avg/=n;
    for(int i=1;i<n;i++){
        int p,q;
		cin>>p>>q;
        v[p].push_back(q);
        v[q].push_back(p);
    }
    dfs_up(1,0);
    dfs_down(1,0);
    cout<<ans.size()<<'\n';
    for(auto &[i,j,k]:ans){
    	cout<<i<<' '<<j<<' '<<k<<'\n';
	}
}

코드 제출 결과

코드가 너무 보기에 난잡해서 수정 한 번 했는데 컴파일 에러에 타임 아웃에.....

(뭘 잘못한 지도 모르고 뭐가 문제지 하면서 맞왜틀 계속 시전)

알고 보니 endl이랑 '\n' 시간 차이 때문에 틀렸던 것......

 

+) #define endl '\n'을 생활화합시다

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 24979] COW Operations  (0) 2023.02.06
[BOJ 19942] 다이어트  (2) 2023.02.06
[BOJ 3687] 성냥개비  (0) 2023.02.05
[BOJ 20543] 폭탄 던지는 태영이  (0) 2023.02.04
[BOJ 14572] 스터디 그룹  (0) 2023.02.03