[POI2007]POW-The Flood

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POI2007]POW-The Flood相关的知识,希望对你有一定的参考价值。

?????????for   names   while   uri   use   ??????   namespace   ??????   etc   

[POI2007]POW-The Floodhttps://www.luogu.org/problemnew/show/P3457

????????????

\(AKD\) ??????????????????????????????????????????????????????????????????????????????,\(AKD\) ????????? ???????????????\(Blue Mary\),\(AKD\) ????????????,???????????????????????????(?????????)????????? ?????????????????????????????????????????????,????????????,???????????????????????????,???????????? ???????????????????????????,????????????????????? ?????????????????? \(AKD\) ??????????????????????????????????????? \(m*n\) ?????????,???????????? \(m*n\) ??? \(1*1\) ??????????????????????????????????????????,??????????????????????????????????????????????????? ????????? \(AKD\) ??????????????????????????????????????????????????????????????????????????????,?????? ??????????????????????????????????????????????????????,??????????????????????????????????????????,??? ?????????????????????????????? \(AKD\) ??????????????? ???????????????????????????????????????????????? \(1*1\) ??????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????,??????????????????,???????????? ??????????????????????????????????????????,???????????????????????????????????????????????????????????? ??????,?????????????????????(????????????????????????????????????)???????????????

???????????????

????????????????????? \(m,n(1<=m,n<=1000)\). ?????? \(m\) ???,?????? \(n\) ??????,?????????????????????????????????????????????;???????????????,??? ????????? \(AKD\) ??????????????????;?????????????????? ???????????????:???????????????????????????????????????????????? \(1000\),???????????????.

???????????????

????????????,??????????????????,????????????????????????????????????????????????

???????????????

6 9
-2 -2 -1 -1 -2 -2 -2 -12 -3
-2 1 -1 2 -8 -12 2 -12 -12
-5 3 1 1 -12 4 -6 2 -2
-5 -2 -2 2 -12 -3 4 -3 -1
-5 -6 -2 2 -12 5 6 2 -1
-4 -8 -8 -10 -12 -8 -6 -6 -4

???????????????

2


??????:
????????????????????????????????????????????????,??????????????????,???????????????????????????[????????????]?????????????????????,???????????????????????????????????????[???????????????????????????????????????????????????????????????],???????????????????????????\(AKD\)?????????????????????????????????????????????,?????????\(Ans++\)

#define RG register
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int N=1005,NN=1e6+5;
inline int read()
{
    RG int x=0,w=1;RG char ch=getchar();
    while(ch<???0???||ch>???9???){if(ch==???-???)w=-1;ch=getchar();}
    while(ch>=???0???&&ch<=???9???)x=x*10+ch-???0???,ch=getchar();
    return x*w;
}
int m,n,H=-1,Ans,cnt,l=1,r;//??????????????????????????????
int A[4]={1,-1,0,0},B[4]={0,0,1,-1};
int a[N][N],b[N][N],fa[NN];
bool used[NN];
struct node{
    int x,y,h;//????????????,????????????
    bool c;//????????????AKD???
}undo[NN];
bool operator < (node A,node B)//?????????
{
    return A.h>B.h;
}
priority_queue<node>Q;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    fa[y]=x;
    if(used[y])used[x]=true;
}
int main()
{
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            fa[m*(i-1)+j]=m*(i-1)+j;
            a[i][j]=read();
            b[i][j]=abs(a[i][j]);
            Q.push((node){i,j,b[i][j],a[i][j]>0});
        }
    Q.push((node){1e9,1e9,1e9,1});//???????????????val???inf?????????,????????????????????????????????????????????????
    while(!Q.empty())
    {
        node now=Q.top();Q.pop();
        cnt++;
        if(H<now.h)
        {
            H=now.h;
            r=cnt-1;
            for(int i=l;i<=r;i++)//????????????
            {
                int fi=find(m*(undo[i].x-1)+undo[i].y);
                if(!used[fi]&&undo[i].c)Ans++,used[fi]=true;
            }
            l=cnt;
        }
        if(cnt==m*n+1)break;
        for(int i=0;i<4;i++)
        {
            int xx=now.x+A[i],yy=now.y+B[i];
            if(xx<1||xx>n||yy<1||yy>m)continue;
            if(b[xx][yy]<=now.h)unite(m*(xx-1)+yy,m*(now.x-1)+now.y);//?????????
        }
        undo[cnt]=now;//??????undo??????,???????????????
    }
    printf("%d\n",Ans);
    return 0;
}

以上是关于[POI2007]POW-The Flood的主要内容,如果未能解决你的问题,请参考以下文章

Luogu345: [POI2007]POW-The Flood

P3457 [POI2007]POW-The Flood

LG_3457_[POI2007]POW-The Flood

Luogu3457POW-The Flood(并查集)

[算法:BFS]Flood Fill模型

poi2007