bzoj1066 (最大流)

本文探讨了一个关于网状地图上蜥蜴逃离问题的解决策略,利用最大流算法来确定最少无法逃离的蜥蜴数量。通过拆点、建边和最大流运算,实现对复杂条件下的最优解寻觅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1066: [SCOI2007]蜥蜴

Time Limit: 1 Sec   Memory Limit: 162 MB
Submit: 2497   Solved: 1233
[ Submit][ Status][ Discuss]

Description

在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

Input

输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

Output

输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

Sample Input

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output

1


解题思路:

首先这道题可以看出是最大流,然后这道题特殊的是点上也有限制,所以对于每个点拆成两个,再建一条唯一的边,跑一边最大流。


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,d;
int len=1;
struct data
 {
  int to,v,next;
 }e[500001];
int h[1000];
int dis[1000];
int q[100000];
int zhi[30][30];
int mark[30][30];


void insert(int x,int y,int w){++len; e[len].to=y; e[len].v=w; e[len].next=h[x]; h[x]=len;}
bool bfs()
 {
  memset(dis,-1,sizeof(dis));
  int tail=1; int head=0; q[tail]=0; dis[0]=0;
  while (head<tail)
  {
  ++head;
  int u=h[q[head]];
  while (u!=-1)
  {
  if (dis[e[u].to]==-1 && e[u].v)
  {
  dis[e[u].to]=dis[q[head]]+1;
  ++tail; q[tail]=e[u].to;
}
u=e[u].next;
  }
 }
if (dis[801]==-1) return 0;else return 1;
 }


int dinic(int now,int sum)
 {
  if (now==801) return sum;
  int u=h[now]; int used=0;
  while (u!=-1)
  {
  if (dis[e[u].to]==dis[now]+1 && e[u].v)
  {
  int w=dinic(e[u].to,min(sum-used,e[u].v));
  used+=w;
  e[u].v-=w; e[u^1].v+=w;
  if (used==sum) return sum;
}
u=e[u].next;
 }
if (used==0) dis[now]=-1;
return used;
 }


int main()
{
scanf("%d %d %d",&n,&m,&d);
memset(h,-1,sizeof(h));
char c[21]; int tot=0;
for (int i=1;i<=n;++i)
 {
  scanf("%s",c);
  for (int j=1;j<=m;++j)
  {
  int g=int(c[j-1])-48;
  zhi[i][j]=g;
  ++tot; insert(tot,tot+1,g);
       ++tot; insert(tot,tot-1,0); mark[i][j]=tot-1;
}
 }
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
       for (int x1=1;x1<=n;++x1)
        for (int y1=1;y1<=m;++y1)
          if (i!=x1 || y1!=j)
           if (abs(i-x1)+abs(j-y1)<=d && zhi[i][j] && zhi[x1][y1])
            {
            insert(mark[i][j]+1,mark[x1][y1],zhi[i][j]); insert(mark[x1][y1],mark[i][j]+1,0);
}
int ass=0;
for (int i=1;i<=n;++i)
{
scanf("%s",c);
for (int j=1;j<=m;++j)
{
if (j<=d || i<=d || (m-j+1)<=d || (n-i+1)<=d && zhi[i][j])  {insert(mark[i][j]+1,801,0x7fffffff);insert(801,mark[i][j]+1,0);}
if (c[j-1]=='L')++ass;
if (c[j-1]=='L' && zhi[i][j])
{
insert(0,mark[i][j],1); insert(mark[i][j],0,0);
}
 }
}
    int ans=0;
    while (bfs())
     {
      ans+=dinic(0,0x7fffffff);
}
    cout<<ass-ans;
}


内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值