24년 KOI 2차 초등부 3번, 중등부 2번이다.
체감상 중등부는 2번, 3번, 4번 난이도가 다 똑같은데 이게 맞나?
그건 그렇고 이 문제 풀이가 정말 재밌어서 풀이를 써보겠다.
먼저
그럼
이제 남은 것은 DAG에서의 최소 이동 횟수이다. 이건 (indegree) + (outdegree) = 2를 다시 한번 이용하면 쉽게 알 수 있다. 저 성질 때문에 DAG인 컴포넌트는 반드시 아래 그림과 같이 생겼다.

시작 노드에서 양갈래로 흩어졌다가 마지막에 모이는 형태이다. 이 경우 시행 횟수는 다음과 같다.
1: 시작 노드에 해당하는 색 2개를 빈 상자에 옮긴다(2회). (indegree = 2이므로 이 색깔의 공 2개는 반드시 상자의 위에 있다)
2: 양갈래 각각을 그래프를 따라가면서 마지막 상자 바로 전까지 옮긴다(x+y회).
3: 마지막 노드에 해당하는 색을 한 곳에 모은다(1회).
즉 x+y+3회가 든다. x+y+2가 DAG의 크기이므로 결국 DAG크기 + 1만큼 이동해야 한다.
그런데 사이클도 (사이클 크기) + 1만큼 이동해야 하므로 종류에 관계없이 (컴포넌트 크기) + 1을 해주면 된다. (다시 말하지만 크기 = 1은 예외 처리를 해줘야 한다)
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma optimize("unroll-loops")
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define all(x) x.begin(), x.end()
#define rll(x) x.rbegin(), x.rend()
#define comp(x) x.erase(unique(all(x)), x.end())
#define MOD 1000000007
#define debug(x) cout << #x<<" is "<<x<<"\n";
#define X first
#define Y second
#define DEB cout<<"[DEBUG]"
#define PAIR(a,b) "("<<a<<", "<<b<<")"
#define PRINT1(V) DEB<<#V<<endl; for(auto i : V)DEB<<i<<"\n"
#define PRINT2(V) DEB<<#V<<endl; for(auto [a,b] : V)DEB<<PAIR(a,b)<<"\n";
typedef __int128_t lll;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> P;
typedef pair<P,ll> PP;
ll p[202020];
ll outd[202020];
ll cnt[202020];
ll n;
ll find(ll x){
if(p[x]<0)return x;
return p[x] = find(p[x]);
}
void merge(ll x, ll y){
x = find(x), y = find(y);
if(x==y)return;
cnt[x] += cnt[y];
p[x] += p[y];
p[y] = x;
if(cnt[x]>1){
cout<<"-1";
exit(0);
}
}
int main(){
fast;
cin>>n;
vector<P> edge;
for(int i = 0 ; i < n ; i++){
ll a,b; cin>>a>>b; outd[a]++; edge.push_back({a,b});
}
for(int i = 1 ; i <= n ; i++)if(outd[i]==2)cnt[i] = 1;
memset(p,-1,sizeof(p));
for(auto [a,b] : edge)merge(a,b);
ll ans = 0;
for(int i = 1 ; i <= n ; i++)if(p[i]<-1)ans += abs(p[i])+1;
cout<<ans;
}

여담으로 기여에다가 재밌다고 써놨는데 똑같이 재밌다고 써놓은 기여가 2개나 더 있다. 역시 갓문제
'백준 > 플래티넘' 카테고리의 다른 글
BOJ 26973 - Circular Barn (P3) (0) | 2024.08.01 |
---|---|
BOJ 31232 삼국지, BOJ 31750 Split the GSHS 3 (P2,P1) (0) | 2024.04.07 |
BOJ 21099 - Four XOR (P4) (1) | 2024.02.16 |
BOJ 8452 - 그래프와 쿼리 (P1) (1) | 2023.12.23 |
BOJ 14701 - 셔틀버스 (P3) (0) | 2023.08.17 |