본문 바로가기

PS/boj

백준 9470 Strahler 순서 (C++)

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

 

9470번: Strahler 순서

지질학에서 하천계는 유향그래프로 나타낼 수 있다. 강은 간선으로 나타내며, 물이 흐르는 방향이 간선의 방향이 된다. 노드는 호수나 샘처럼 강이 시작하는 곳, 강이 합쳐지거나 나누어지는 곳

www.acmicpc.net

간단해보여서 bfs로 풀어볼라했는데 복잡해지길래 위상정렬을 쓰면 훨씬 쉬울것 같아서 위상정렬을 사용했습니다. 현재 노드의 Strahler순서를 기록하는것에 유의하면서 풀면 됩니다. 저는 pair배열을 사용했습니다.

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<bitset>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
  cin.tie(0)->sync_with_stdio(0);
}
long long mod=1000000007;
int main(){
    fast_io();
    int T;
    cin>>T;
    while(T--){
        int K,M,P;
        cin>>K>>M>>P;
        vector<vector<int>> Edge(M+1,vector<int>());
        vector<int> indegree(M+1,0);
        vector<pair<int,int>> visit(M+1,{0,0});
        for(int x=0;x<P;x++){
            int src,dst;
            cin>>src>>dst;
            indegree[dst]++;
            Edge[src].push_back(dst);
        }
        queue<int> Q;
        for(int x=1;x<=M;x++){
            if(indegree[x]==0){
                Q.push(x);
                visit[x]={1,1};
            }
        }
        while(!Q.empty()){
            int now=Q.front();
            Q.pop();
            int k=visit[now].second>1 ? visit[now].first+1 : visit[now].first;
            for(auto i : Edge[now]){
                indegree[i]--;
                if(visit[i].first<k){
                    visit[i].first=k;
                    visit[i].second=1;
                }
                else if(visit[i].first==k){
                    visit[i].second++;
                }
                if(indegree[i]==0){
                    Q.push(i);
                }
            }
        }
        visit[M].first= visit[M].second>1 ? visit[M].first+1 : visit[M].first;
        cout<<K<<" "<<visit[M].first<<'\n';
    }
}

'PS > boj' 카테고리의 다른 글

백준 23325 마법천자문 (C++)  (0) 2022.07.10
백준 10838 트리 (C++)  (0) 2022.07.09
백준 15910 바나나나빠나나 (C++)  (0) 2022.07.07
백준 3114 사과와 바나나 (C++)  (0) 2022.07.06
백준 23044 트리 조각하기 (C++)  (0) 2022.07.05