院科技文化節 初級組 K-注水題(多源bfs)
阿新 • • 發佈:2018-12-03
題解
多源bfs,bfs時記錄每個點的最短距離
類似樹的層次遍歷,相當於以中間某層開始遍歷,沒有根
QAQ感覺命題組出的題還是不錯的吖拓展眼界
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const int INF=0x3f3f3f3f; const int maxn=1e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-7; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<int,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int n,m,k; int miin[2005][2005]; int x[10005],y[10005]; int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; int ans; struct node { int x,y; int step; node(int xx,int yy,int s):x(xx),y(yy),step(s){ } }; bool ok(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m)return 1; return 0; } void bfs() { queue<node>q; for(int i=0;i<k;++i) { q.push(node(x[i],y[i],0)); miin[x[i]][y[i]]=0; } while(!q.empty()) { node tmp=q.front(); q.pop(); int x=tmp.x,y=tmp.y,step=tmp.step; if(step>miin[x][y])continue; ans=max(ans,step); for(int i=0;i<4;++i) { int xx=x+dx[i],yy=y+dy[i]; if(ok(xx,yy)&&miin[xx][yy]>step+1) { q.push(node(xx,yy,step+1)); miin[xx][yy]=step+1; } } } } int main() { memset(miin,0x3f,sizeof(miin)); ios::sync_with_stdio(0); cin>>n>>m>>k; for(int i=0;i<k;++i) { cin>>x[i]>>y[i]; } bfs(); cout<<ans<<endl; return 0; }