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

BOJ 11111 두부장수 장홍준 2

·218 words·2 mins
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 대충봐도 격자그래프에서 MCMF같은데..
    • 덜끊어도 되니까 MaxFlow가 아닌가?
    • 아하 뒤집으면 된다
  • 아하, Flow 자체도 다 보내기 전이 최적일수도 있는것만 잊지 말자

💻 풀이
#

  • 코드 (C++):
void solve(){
    int N, M; cin >> N >> M;

    vector<vector<int>> costs = {
        {10, 8, 7, 5, 1},
        {8, 6, 4, 3, 1},
        {7, 4, 3, 2, 1},
        {5, 3, 2, 2, 1},
        {1, 1, 1, 1, 0}
    };

    vector<vector<int>> board(N, vector<int>(M));
    map<char, int> mp;
    mp['A'] = 0; mp['B'] = 1; mp['C'] = 2; mp['D'] = 3; mp['F'] = 4;
    rep(i, 0, N){
        string S; cin >> S;
        rep(j, 0, M) board[i][j] = mp[S[j]];
    }

    MinCostMaxFlow MCMF(N*M+2);
    MCMF.setST(N*M, N*M+1);
    vector<int> dx = {-1, 1, 0, 0}, dy = {0, 0, -1, 1};
    rep(i, 0, N) rep(j, 0, M){
        if((i+j)%2){
            MCMF.add(i*M+j, N*M+1, 1, 0);
            continue;
        }

        MCMF.add(N*M, i*M+j, 1, 0);
        rep(d, 0, 4){
            int nx = i + dx[d], ny = j + dy[d];
            if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
            MCMF.add(i*M + j, nx*M + ny, 1, -costs[board[i][j]][board[nx][ny]]);
        }
    }
    cout << max(0LL, -MCMF.match());
}
🔒

구현 코드 잠금

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

🛒 쿠팡 방문하고 코드 보기

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