bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252

又没能自己想出来...

一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不走了...

然而实际上直接多源bfs,从所有1一起开始,因为只需要找到0碰到的第一个1即可;

这样搜一遍就可以,复杂度很美。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int const maxn=1005;
int n,m,a[maxn][maxn],b[maxn][maxn],dx[5]={1,0,-1,0},dy[5]={0,1,0,-1};
bool vis[maxn][maxn];
queue<pair<int,int> >q;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%1d",&a[i][j]);
            if(a[i][j])q.push(make_pair(i,j)),vis[i][j]=1;
        }
    while(q.size())
    {
        int x=q.front().first,y=q.front().second; q.pop();
        for(int i=0;i<4;i++)
        {
            int tx=x+dx[i],ty=y+dy[i];
            if(vis[tx][ty]||tx<1||ty<1||tx>n||ty>m)continue;
            b[tx][ty]=b[x][y]+1; vis[tx][ty]=1;
            q.push(make_pair(tx,ty));
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}    

原文地址:https://www.cnblogs.com/Zinn/p/9382146.html

时间: 2024-10-08 11:00:14

bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs的相关文章

BZOJ2252 [2010Beijing wc]矩阵距离

2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 624  Solved: 304[Submit][Status][Discuss] Description 假设我们有矩阵,其元素值非零即1 a11…… a1m ……………. an1…….anm ?定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L) ?? Input 输入文件的第一行为两个整数,分别代表n和m.

BZOJ2253: [2010 Beijing wc]纸箱堆叠

题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第三维插入到每个树状数组的节点里. 除了权值之外每个节点还要保持一个mx,表示该子树内最大的f[i]. 这样就可以nlg^n了 UPD:试了下不带旋转的treap果然会被卡 orz 代码: 1 #include<cstdio> 2 3 #include<cstdlib> 4 5 #inc

【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

[BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P)(a^4 mod p,a^5 mod p,a^6 mod P)....(a^(3n-2) mod p,a^(3n-1) mod p,a^(3n) mod p)的n个纸箱.在运输这些纸箱时,为了节约空间,必须将它们嵌套堆叠起来.一个纸箱可以嵌套

【BFS】bzoj2252 [2010Beijing wc]矩阵距离

要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止. 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 const int dx[]={0,0,-1,1},dy[]={1,-1,0,0}; 6 struct Point{int x,y;Point(const int &a,const int &b){x

BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将memset改成手动clear会快很多. 还有就是第一维相同的情况,划分为两个不存在第一维相同的两个区间即可. #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #inc

【CH2501】 矩阵距离 解题报告

CH2501 矩阵距离 描述 给定一个N行M列的01矩阵 A,\(A[i][j]\) 与 \(A[k][l]\) 之间的曼哈顿距离定义为: \(dist(A[i][j],A[k][l])=|i-k|+|j-l|\) 输出一个N行M列的整数矩阵B,其中: \(B[i][j]=min(1 \le x \le N,1 \le y \le M,A[x][y]=1)?{dist(A[i][j],A[x][y])}\) 即求与每个位置曼哈顿距离最近的1 \(N,M \le 1000\). 输入格式 第一行两

BZOJ 2462 BeiJing 2011 矩阵模板 二维hash

题目大意:给出一个m*n的由01组成的矩阵,下面有q个询问,查询矩阵中存不存在大小为k*l的子矩阵. 思路:二维hash.我们先把大矩阵hash,然后把所有可能的k*l的子矩阵都插到哈希表里,然后只要对于每个询问hash一下看哈希表中是否存在. 值得一提的是,这个题只需要输出10个1就可以AC了.. CODE: #include <cstdio> #include <bitset> #include <cstring> #include <iostream>

BZOJ 1270 Beijing Wc 2008 雷涛的小猫 动态规划

题目大意:给出一个棵果树,上面有些地方长了一些果子.现在有一只小猫想去吃这些果子,他从最高处往下跳,每到一个地方可以吧这个地方的果子全吃掉.也可以向旁边的果树上跳.问小猫最多能吃到多少果子. 思路:WC的无脑动规大水题.随便加个小优化就过了.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 3510 using n

【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列

一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的结点的深度来确定$tb数组$中的滑块. 因为分数规划要找的是$max$,BFS遍历当前结点的深度越来越大,这样滑块也是单调向右滑动,所以滑块里的最大值就应当用单调队列解决 #include<cstdio> #include<algorithm> #define read(x) x=ge