반응형

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

 

9470번: Strahler 순서

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

www.acmicpc.net

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

vector<int> adj[1001];
vector<int> point[1001];
int degree[1001];
int val[1001];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int t;
    cin >> t;

    for (int T = 0; T < t; T++) {
        int k, m, p;
        cin >> k >> m >> p;
        memset(val, 0, sizeof(val));
        memset(degree, 0, sizeof(degree));
        for (int i = 0; i < 1001; i++) {
            adj[i].clear();
            point[i].clear();
        }


        for (int i = 0; i < p; i++) {
            int a, b;
            cin >> a >> b;
            adj[a].push_back(b);
            degree[b]++;
        }

        queue<int> Q;
        for (int i = 1; i <= m; i++) {
            if (degree[i] == 0) {
                Q.push(i);
                val[i] = 1;
            }
        }

        int ans = 0;
        while (!Q.empty()) {
            int x = Q.front(); Q.pop();

            for (auto nx : adj[x]) {
                point[nx].push_back(val[x]);

                if (--degree[nx] == 0) {
                    Q.push(nx);

                    sort(point[nx].begin(), point[nx].end());

                    int val_nx = point[nx][point[nx].size() - 1];
                    if (point[nx].size() >= 2 && val_nx == point[nx][point[nx].size() - 2]) {
                	    val[nx] = val_nx + 1;
                   	}
                    else {
						val[nx] = val_nx;
                    }

                    ans = max(ans, val[nx]);
                }
            }
        }



        cout << k << ' ' << ans << '\n';
    }

    return 0;
}

백준 9470번

반응형

+ Recent posts