Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 4013 ATM

·212 words·1 min
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 그래프가 DAG라면 위상정렬을 하면서 DP를 진행할 수 있을텐데..
    • 같은 정점을 여러번 들릴 수 있으므로, 어떤 정점이 사이클 안에 들어있다면 해당 사이클 내의 ATM을 모두 들릴 수 있다!
    • 서로 자유롭게 이동 가능한 관계라면 모두 자유롭게 들릴 수 있으므로, 이를 SCC로 묶어 DAG로 만들자.

💻 풀이
#

  • 코드 (C++):
void solve(){
    cin >> N >> M;
    DirectedGraph graph(N+1);
    rep(i, 0, M){
        int u, v; cin >> u >> v;
        graph.add_edge(u, v);
    }
    DirectedGraph dag = graph.getCompressedGraph();
    int sz = dag.V;
    vector<int> val(sz), DP(sz, -1e9), indeg(sz, 0);
    rep(i, 1, N+1){
        int X; cin >> X;
        val[graph.sccId[i]] += X;
    }
    int S, P; cin >> S >> P;
    S = graph.sccId[S];
    DP[S] = val[S];
    rep(u, 0, sz) for(auto &v: dag.links[u]) indeg[v]++;
    queue<int> Q;
    rep(i, 0, sz) if(indeg[i] == 0) Q.push(i);
    while(!Q.empty()){
        int cur = Q.front(); Q.pop();
        for(auto nxt: dag.links[cur]){
            DP[nxt] = max(DP[nxt], DP[cur] + val[nxt]);
            indeg[nxt]--;
            if(indeg[nxt] == 0) Q.push(nxt);
        }
    }
    int ans = 0;
    rep(i, 0, P){
        int X; cin >> X;
        X = graph.sccId[X];
        ans = max(ans, DP[X]);
    }
    cout << ans << '\n';
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다