随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

在一个 RC列的网格地图中有一些高度不同的石柱,第 ii 行 jj 列的石柱高度为 a[i][j]

一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。

每行每列中相邻石柱的距离为 1,蜥蜴的跳跃距离是 D,即蜥蜴可以跳到平面距离不超过 D 的任何一个石柱上。

石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减 1(如果仍然落在地图内部,则到达的石柱高度不变)。

如果该石柱原来高度为 1,则蜥蜴离开后消失,以后其他蜥蜴不能落脚。

任何时刻不能有两只蜥蜴在同一个石柱上。问无法逃离的蜥蜴总数的最小值。

 

网络流建模,把点拆为2个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include<cmath>
#include <queue>
#include <cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =1e4+100,M=7e5+100;
 
 const int inf =1e9;
 int a[N][N];
  
 int all=1,hd[N],go[M],w[M],nxt[M];
   
 int S,T;
 int dis[M],ans=0,now[M];
   
   
 int R,C,D;
 void add_(int x,int y,int z){
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=z;
     swap(x,y);
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=0;
 }
   bool bfs(){
     for(int i=0;i<N;i++) dis[i]=inf;
     queue<int> q;
     q.push(S);
     now[S]=hd[S];
     dis[S]=0;
      
     while(q.empty()==0){
         int x=q.front();
         q.pop();
         for(int i=hd[x];i;i=nxt[i]){
             int y=go[i];
             if(w[i]>0&&dis[y]==inf){
                 dis[y]=dis[x]+1;
                 now[y]=hd[y];
                 q.push(y);
                 if(y==T) return 1;
             }
         }
     }
     return 0;
 }
 int dfs(int x,int sum){
     if(x==T) return sum;
     int k,res=0;
      
     for(int i=now[x];i&∑i=nxt[i]){
         now[x]=i;
         int y=go[i];
         if(w[i]>0&&(dis[y]==dis[x]+1)){
             k=dfs(y,min(sum,w[i]));
             if(k==0) dis[y]=inf;
             w[i]-=k;
             w[i^1]+=k;
             res+=k;
             sum-=k;
         }
     }
     return res;
 }
  
 int ID(int i,int j){
    return (i-1)*R+j ;
 }
 double Dis(int x1,int y1,int x2,int y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
 }
 signed main(){
    int Cnt= 0;
    cin>>R>>C>>D;
    char c;
    int i,j;
    S=0,T=2*R*C+1;
    for(i=1;i<=R;i++)
     for(j=1;j<=C;j++){
        cin>>c;
        a[i][j] =c-'0';
     }
    for(i=1;i<=R;i++)
     for(j=1;j<=C;j++){
        cin>>c;
        if(c=='L'){
            Cnt++;
            add_(S,ID(i,j),1);
        }
     
      for(i=1;i<=R;i++)
      for(j=1;j<=C;j++){
           if(a[i][j])
             add_(ID(i,j),ID(i,j)+R*C,a[i][j]) ;      
      }
      
     for(i=1;i<=R;i++)
      for(j=1;j<=C;j++){
       if(i>D && i<=R-D && j>D && j<=C-D)
             continue ;
           if(a[i][j])
             add_(ID(i,j)+R*C,T, a[i][j]) ;       
      }
       
     for(i=1;i<=R;i++)
      for(j=1;j<=C;j++)
       for(int k=1;k<=R;k++)
        for(int l=1;l<=C;l++){
            if(i==k && j==l ) continue ;
            if(Dis(i,j,k,l)<=double(D)&&
                a[i][j]&&a[k][l])
            add_(ID(i,j)+R*C,ID(k,l),inf) ;
        }
     
    int ans =0;
    while(bfs()) ans+=dfs(S,inf);
    cout<< Cnt - ans<<endl;
 }

 

posted on   towboat  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示