[2019.1.17]BZOJ1066 [SCOI2007]蜥蜴

首先,发现数据范围很小,结合题意认为这是一道搜索网络流题。

考虑建模。

我们把图中高度不为0的石柱看做点,如何连边呢?

首先,两个相互可以到达的石柱之间需要连容量为\(inf\)的边,因为如果石柱不消失,蜥蜴可以在这两个石柱之间条无数次。

然后建立汇点\(t\),每一个与边界距离不超过\(d\)的点都向\(t\)连一条容量为\(inf\)的边,因为任何一根可以跳出边界的石柱在不消失的情况下,都可以让无数只蜥蜴跳出。

接下来建立源点\(s\),\(s\)向每一个有蜥蜴的石柱连一条容量为1的边。这个很好理解,因为每个石柱上只有1只蜥蜴,所以这条边只能流过1的流量。

剩下的是最重要的,如何保证一个石柱只被踩它的高度次呢?

我们拆点,将一个石柱拆成两个点,一个连着所有入边,一个连着所有出边,入边点向出边点连容量为石柱高度的边。

然后这个网络的最大流就是答案。

注意要输出的是不能跳出边界的蜥蜴数量,所以我们要用蜥蜴总数减去答案输出。

code:

#include<bits/stdc++.h>
#define REV(x) ((x&1)?x+1:x-1)
using namespace std;
const int INF=1e9;
struct edge{
    int t,w,nxt;
}e[100010];
struct node{
    int x,y;
}d[810];
int n,m,dn,mp[25][25],t,r,cnt,be[810],dep[810],vis[810],tl,ans;
char tc;
queue<int>q;
void getn(int &x){
    x=getchar();
    while(!isdigit(x))x=getchar();
    x-='0';
}
void getc(char &x){
    x=getchar();
    while(x!='.'&&x!='L')x=getchar();
}
bool P(int xf,int yf,int xt,int yt){
    return (xf-xt)*(xf-xt)+(yf-yt)*(yf-yt)<=r*r;
}
void add(int x,int y,int v){
    e[++cnt].t=y,e[cnt].w=v,e[cnt].nxt=be[x],be[x]=cnt;
}
void Add(int x,int y,int v){
    add(x,y,v),add(y,x,0);
}
void Build(){
    for(int i=1;i<=dn;i+=2)for(int j=i+2;j<=dn;j+=2)P(d[i].x,d[i].y,d[j].x,d[j].y)?Add(i+1,j,INF),Add(j+1,i,INF),0:0;
    for(int i=1;i<=dn;i+=2)(min(d[i].x,n-d[i].x+1)<=r||min(d[i].y,m-d[i].y+1)<=r)?Add(i+1,dn+1,INF),0:0;
}
bool Getd(){
    memset(dep,0,sizeof(dep));
    int tt=0;
    q.push(0),dep[0]=1;
    while(!q.empty()){
        t=q.front(),q.pop(),tt++;
        for(int i=be[t];i;i=e[i].nxt)(!dep[e[i].t]&&e[i].w)?dep[e[i].t]=dep[t]+1,q.push(e[i].t),0:0;
    }
    return dep[dn+1];
}
int dfs(int x,int nf){
    if(x==dn+1)return nf;
    vis[x]=1;
    int tf,af=0;
    for(int i=be[x];nf&&i;i=e[i].nxt)(!vis[e[i].t]&&e[i].w&&dep[e[i].t]==dep[x]+1)?tf=dfs(e[i].t,min(nf,e[i].w)),e[i].w-=tf,e[REV(i)].w+=tf,nf-=tf,af+=tf:0;
    return vis[x]=0,af;
}
void Dinic(){
    while(Getd())ans+=dfs(0,INF);
}
int main(){
    scanf("%d%d%d",&n,&m,&r);
    for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)getn(t),t?mp[i][j]=++dn,d[dn]=(node){i,j},Add(dn,dn+1,t),++dn:0;
    for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)getc(tc),tc=='L'?(++tl,mp[i][j]?Add(0,mp[i][j],1),0:0):0;
    Build();
    Dinic();
    printf("%d",tl-ans);
    return 0;
}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ1066.html

内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值