接続されたブロック+bfs

原題へのリンク: 0702-The Shortest Path Topic- Virtual Judge

タイトル説明:

 質問を読んで少し混乱しましたが、理解できるのは、最大容量は接続されているすべての場所のエッジの重みの合計に等しいということです。

この例では、接続された場所を見つけたい場合は、接続されたブロック + bfs (ブシ) の強力なソリューションを考えることができることが明確にわかります。

アイデアの分析:

全体的な考え方は、最初にデータを読み取り、bfs を使用して完全に接続されたブロックを見つけます。ちなみに、sum を使用して各ポイントの値の合計を記録し、最後にそれを以前に接続されたブロックの ans と比較します。ブロックし、max( sum, ans) を選択して、次の検索を実行します。

ちょっとした落とし穴は、この質問には複数のデータセットがあり、接続されたブロックが完了した後、次回接続されたブロックを再度訪問することを避けるために、値 -1 を割り当てる必要があることです。

#include <iostream>
#include <queue>

const int N = 1005;
const int dir[][2] = {
   
   {-1, 0}, {1, 0}, {0, -1}, {0, 1}};

int a[N][N];
int n, m;

int bfs(int x, int y) {
    std::queue<std::pair<int, int> > q;//运用了pair数组,来代替了有多个数据的Node数组
    q.push(std::make_pair(x, y));
    int res = a[x][y];//记录每个点的值之和
    a[x][y] = 0;
    while (!q.empty()) {//正常的bfs
        std::pair<int, int> f = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            int xx = f.first + dir[i][0];
            int yy = f.second + dir[i][1];
            if (xx > 0 && yy > 0 && xx <= n && yy <= m && a[xx][yy] != 0) {//判断特殊临界点
                res += a[xx][yy];
                a[xx][yy] = 0;//避免下次再访问到
                q.push(std::make_pair(xx, yy));
            }
        }
    }
    return res;
}

void solve() {
    std::cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            std::cin >> a[i][j];
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] != 0) {
                int res = bfs(i, j);
                ans = std::max(ans, res);与之前的答案取一个最大值
            }
        }
    }
    std::cout << ans << '\n';
}

int main() {
    int T;
    std::cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

 概要: 全体的なアイデアは、接続されたブロック + bfs です。これはまだ考えやすいです。bfs をコーディングして詳細を処理した後、AC および Accepted! を行うことができます。

 作成は簡単ではありません、売春しないでくださいwww!3 つのリンクと注目をお願いします。ありがとうございます。

おすすめ

転載: blog.csdn.net/2301_76331300/article/details/131589377