1. 程式人生 > >BZOJ 1066 蜥蜴

BZOJ 1066 蜥蜴

CA define ring 傳送門 pro efi 曼哈頓距離 tps online

傳送門

題解:這題就是HDU2732的中文題面。。。蜥蜴跳的距離是曼哈頓距離。建一個源點對每一個L所在的地方建一個容量為1的邊,對柱子如果能跳出去就與匯點建一個容量為柱子容量的邊,柱子的出點與入點建一個容量INF的邊,柱子與柱子之間只要滿足條件就將一個柱子的出點,與另一個柱子的入點建一條為柱子容量的邊

 
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include 
<vector> #include <cstring> #include <iomanip> #include <set> #include<ctime> //CLOCKS_PER_SEC #define se second #define fi first #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Pii pair<int,int> #define Pli pair<ll,int> #define
ull unsigned long long #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0) const double Pi=3.14159265; const int N=1e5+50; const ull base=163; const int INF=0x3f3f3f3f; using namespace std; int head[N],nx[N],to[N],cap[N],cur[N]; int s,t; int tot=0; void add(int u,int v,int
c){ nx[tot]=head[u]; to[tot]=v; cap[tot]=c; head[u]=tot++; nx[tot]=head[v]; to[tot]=u; cap[tot]=0; head[v]=tot++; } int d[N]; int bfs(){ memset(d,-1,sizeof(d)); queue<int>q; q.push(s); d[s]=1; while(!q.empty()){ int u=q.front();q.pop(); for(int i=head[u];~i;i=nx[i]){ int v=to[i]; if(d[v]==-1&&cap[i]>0){ d[v]=d[u]+1; q.push(v); } } } return d[t]!=-1; } int dfs(int s,int a){ if(s==t||a==0)return a; int flow=0,f; for(int &i=cur[s];~i;i=nx[i]){ int v=to[i]; if(d[v]==d[s]+1&&cap[i]>0&&(f=dfs(v,min(a,cap[i])))){ flow+=f; cap[i]-=f; cap[i^1]+=f; a-=f; if(a==0)break; } } return flow; } int dinic(){ int ans=0; while (bfs()) { for(int i=0;i<=t;i++)cur[i]=head[i]; while(int di=dfs(s,INF))ans+=di; } return ans; } char mat[100][100]; char str[100][100]; int cal(int x,int y,int a,int b){ return abs(x-a)+abs(y-b); } vector<Pii>vec; int main(){// s--0 出n*m+m*i+j+30 入m*i+j s=0,t=2000; int n,m,f; scanf("%d%d%d",&n,&m,&f); memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++){ scanf("%s",mat[i]+1); for(int j=1;j<=m;j++){ if(mat[i][j]!=0){ vec.pb({i,j}); add(m*i+j,n*m+m*i+j+30,mat[i][j]-0); if(i<=f||j<=f||(n-i)<f||(m-j)<f){ add(n*m+30+m*i+j,t,mat[i][j]-0);//可以跳出去 } } } } for(int i=0;i<vec.size();i++){ Pii u=vec[i]; for(int j=i+1;j<vec.size();j++){ Pii v=vec[j]; if(cal(u.fi,u.se,v.fi,v.se)<=f){ //cout<<"fds"; add(n*m+m*u.fi+u.se+30,m*v.fi+v.se,INF); add(n*m+m*v.fi+v.se+30,m*u.fi+u.se,INF); } } } int ss=0; for(int i=1;i<=n;i++){ scanf("%s",str[i]+1); for(int j=1;j<=m;j++){ if(str[i][j]==L){ ss++; add(0,m*i+j,1); } } } int d=dinic(); int ans=ss-d; cout<<ans<<endl; return 0; }

BZOJ 1066 蜥蜴