洛谷 P3355 骑士共存问题

骑士放置问题与网络流
本文介绍了一种利用网络流算法解决骑士放置问题的方法。通过将棋盘上的位置建模为图中的节点,并根据骑士的移动规则设置边及流量限制,最终通过计算最大流来确定最多能放置多少个骑士。

题意:给你一个棋盘,然后有一个骑士rider,棋盘上有一些障碍,问你最多放多少个骑士

思路:期初我一直以为这种题是什么八皇后问题的变形,队友告诉我,这是网络流,由于这道题的黄色格子上的棋子的下一步总是调到红色格子上,所以我们把所有的红色格子连到一个超级源上,所有的黄色格子连接到一个超级汇上,然后对于每个可以跳到的位置我们在建立一条边,容量为1 ,因为我们最后求的是这张图的最小割,而最小割定理我们知道,最小割其实就是图的最大流,之前的 板子可能出了一点点问题,不在用了,总是TLE,不知道为什么,很玄学(玄不救非,氪不改命!!)

代码:

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define zero(a) fabs(a)<eps
#define lowbit(x) (x&(-x))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define MOD 1000000007
int max(int x,int y){return x>y?x:y;};
int min(int x,int y){return x<y?x:y;};
int max(int x,int y,int z){return max(x,max(y,z));};
int min(int x,int y,int z){return min(x,min(y,z));};
typedef long long LL;
const double PI=acos(-1.0);
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const int INF=0x7fffffff;
const LL linf=0x3f3f3f3f3f3f3f3fLL;
int dir[8][2]= {1,2,-1,2,2,1,-2,1,-1,-2,1,-2,-2,-1,2,-1};
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
using namespace std;

struct Edge{
    int next,to,f;
};
struct Dinic
{
    int s,t;
    Edge e[1000010];
    int cnt=2,head[1000010]={0};
    int dis[1000010]={0};
    Dinic (){}
    void init(int _s,int _t)
    {
        s=_s,t=_t;
    }
    void addedge(int u,int v,int f)
    {
        e[cnt]={head[u],v,f};
        head[u]=cnt++;
        e[cnt]={head[v],u,0};
        head[v]=cnt++;
    }
    bool bfs()
    {
        memset(dis,0,sizeof(dis));
        dis[s]=1;
        queue<int> q;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u];i;i=e[i].next)
            {
                int v=e[i].to;
                if(!dis[v]&&e[i].f>0)
                {
                    dis[v]=dis[u]+1;
                    q.push(v);
                }
            }
        }
        return dis[t]!=0;
    }

    int dfs(int u,int flow)
    {
        if(u==t||flow==0) return flow;
        int flow_sum=0;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to,f=e[i].f;
            if(dis[v]!=dis[u]+1||f==0) continue;
            int temp=dfs(v,min(flow-flow_sum,f));
            e[i].f-=temp;
            e[i^1].f+=temp;
            flow_sum+=temp;
            if(flow_sum>=flow) break;
        }
        if(!flow_sum) dis[u]=-1;
        return flow_sum;
    }

    int maxflow()
    {
        int ans=0;
        while(bfs())
        {
            while(int temp=dfs(s,INF))
                ans+=temp;
        }
        return ans;
    }
}DC;

#define id(x,y) ((x-1)*n+y)
bool mp[210][210];

int main()
{
    int n,m;
    n=read(),m=read();
    int t=n*n+1;
    int s=0;
    DC.init(s,t);
    for(int i=1;i<=m;i++){
        int p,q;
        p=read(),q=read();
        mp[p][q]=1;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mp[i][j])continue;
            if((i+j)%2){
                DC.addedge(DC.s,id(i,j),1);
                for(int k=0;k<8;k++){
                    int p=i+dir[k][0];
                    int q=j+dir[k][1];
                    if(p<1||p>n||q<1||q>n||mp[p][q]) continue;
                    DC.addedge(id(i,j),id(p,q),inf);
                }
            }
            else{
                DC.addedge(id(i,j),DC.t,1);
            }
        }
    }

    int ans=DC.maxflow();
    printf("%d\n",n*n-m-ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/lalalatianlalu/p/9055059.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值