[luogu2825 HEOI2016/TJOI2016] 游戏 (二分图最大匹配)

探讨在给定的游戏地图上,如何通过二分图最大匹配算法确定最多可放置且互不干扰的炸弹数量。分析地图元素对炸弹放置的影响,提供算法实现细节。

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

[luogu2825 HEOI2016/TJOI2016] 游戏 (二分图最大匹配)

传送门

Description

在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂。简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹。在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到。炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威力可以穿透软石头,但是不能穿透硬石头。给定一张nm的网格地图:其中代表空地,炸弹的威力可以穿透,可以在空地上放置一枚炸弹。x代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。#代表硬石头,炸弹的威力是不能穿透的,不能在此放置炸弹。例如:给出14的网格地图xx,这个地图上最多只能放置一个炸弹。给出另一个14的网格地图x#,这个地图最多能放置两个炸弹。现在小H任意给出一张n*m的网格地图,问你最多能放置多少炸弹。

Input

第一行输入两个正整数n,m,n表示地图的行数,m表示地图的列数。1≤n,m≤50。接下来输入n行m列个字符,代表网格地图。的个数不超过nm个。

Output

输出一个整数a,表示最多能放置炸弹的个数

Sample Input

4 4
#∗∗∗
∗#∗∗
∗∗#∗
xxx#

Sample Output

5

Solution

实际上就是互相影响的不能同时选择
把图按照块编号后跑最大匹配

Code

//By Menteur_Hxy
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
#define ins(a,b,c) add(a,b,c),add(b,a,0)
#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,cst[cnt]=c,head[a]=cnt
using namespace std;

int read() {
    int x=0,f=1; char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=1010,INF=0x3f3f3f3f;
int n,m,xid,yid,S,T,cnt;
int nxt[N*N],to[N*N],cst[N*N],head[N*N],cur[N*N];
int map[N][N],dx[N][N],dy[N][N],que[N*N<<2],dis[N*N];

bool bfs() {
    memset(dis,0,sizeof(dis));
    int h=0,t=1; que[++h]=S; dis[S]=1;
    while(h<=t) {
        int u=que[h++];
        E(i,u) if(!dis[to[i]]&&cst[i]>0)
            dis[to[i]]=dis[u]+1,que[++t]=to[i];
    }
    return dis[T];
}

int dfs(int u,int flow) {
    if(u==T) return flow;
    int used=0;
    for(register int &i=cur[u],v;i;i=nxt[i]) 
        if(cst[i]>0&&dis[(v=to[i])]==dis[u]+1) {
            int tmp=dfs(v,min(flow-used,cst[i]));
            cst[i]-=tmp,cst[i^1]+=tmp;
            used+=tmp; if(used==flow) return flow;
        }
    if(!used) dis[u]=-1;
    return used;    
}

int dinic() {
    int res=0;
    while(bfs()) {
        F(i,0,T) cur[i]=head[i];
        res+=dfs(S,INF);
    }
    return res;
}

int main() {
    n=read(),m=read();
    F(i,1,n) {
        scanf("\n");
        F(j,1,m) {
            char ch=getchar();
            if(ch=='x') map[i][j]=1;
            else if(ch=='#') map[i][j]=2;
        }
    }
    F(i,1,n) {
        xid++;
        F(j,1,m) 
            dx[i][j]=xid,xid+=(map[i][j]==2);
    }
    F(i,1,m) {
        yid++;
        F(j,1,n) 
            dy[j][i]=yid,yid+=(map[j][i]==2);
    }
    S=0,T=xid+yid+1,cnt=1;
    F(i,1,xid) ins(S,i,1); F(i,1,yid) ins(i+xid,T,1);
    F(i,1,n) F(j,1,m) if(!map[i][j]) 
        ins(dx[i][j],dy[i][j]+xid,1);
    printf("%d",dinic());
    return 0;
}
posted @ 2018-08-16 09:39 Menteur_Hxy 阅读( ...) 评论( ...) 编辑 收藏
内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值