骑士共存问题

时空限制1000ms / 128MB

题目描述

在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入

对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击

输入输出格式

输入格式:

第一行有 2 个正整数n 和 m (1<=n<=200, 0<=m<n2),分别表示棋盘的大小和障碍数。接下来的 m 行给出障碍的位置。每行 2 个正整数,表示障碍的方格坐标。

输出格式:

将计算出的共存骑士数输出

输入输出样例

输入样例:

3 2
1 1
3 3

输出样例:

5

说明

题目链接:https://www.luogu.org/problemnew/show/P3355


这一题和方格取数问题思路是一样的。当时我还没学二分图最大点权独立集,所以强行理解了一波最小割(emmmm)。如果对图进行黑白染色,使白格只与黑格相邻,黑格只与白格相邻,则观察发现任何互相冲突的两个骑士一定属于不同颜色的格子,于是这题就变成了很裸的二分图最大点权独立集。
还有一个很蠢的问题:我以前一直以为网络流跑二分图相关问题的时候,对于二分图无论是加双向边还是单向边对算法没有影响,结果今天WA到我怀疑人生。。。。。。理性分析一下发现不能建双向边,因为这样的话有可能会把某些不能形成流的情况强行形成流,因此这种网络流的题目还是有一个全局流向的概念比较好,然后按照这个全局流向来建边。

#include<bits/stdc++.h>
#define INF LLONG_MAX/2
#define N 40050
using namespace std;struct ss
{int v,next;long long flow;
};
int head[N],now_edge=0,S,T;
ss edg[N*32];void init()
{now_edge=0;memset(head,-1,sizeof(head));
}void addedge(int u,int v,long long flow)
{edg[now_edge]=(ss){v,head[u],flow};head[u]=now_edge++;edg[now_edge]=(ss){u,head[v],0};head[v]=now_edge++;
}int dis[N];int bfs()
{memset(dis,0,sizeof(dis));queue<int>q;q.push(S);dis[S]=1;while(!q.empty()){int now=q.front();q.pop();for(int i=head[now];i!=-1;i=edg[i].next){ss &e=edg[i];if(e.flow>0&&dis[e.v]==0){dis[e.v]=dis[now]+1;q.push(e.v);}}}if(dis[T]==0)return 0;return 1;
}int current[N];
long long dfs(int x,long long maxflow)
{if(x==T)return maxflow;for(int i=current[x];i!=-1;i=edg[i].next){current[x]=i;ss &e=edg[i];if(e.flow>0&&dis[e.v]==dis[x]+1){long long flow=dfs(e.v,min(maxflow,e.flow));if(flow!=0){e.flow-=flow;edg[i^1].flow+=flow;return flow;}}}return 0;
}long long dinic()
{long long ans=0,flow;while(bfs()){for(int i=0;i<N;i++)current[i]=head[i];while(flow=dfs(S,INF))ans+=flow;}return ans;
}int color[205][205]={0};
int num[205][205];
int Map[205][205]={0};
int n;int check(int x,int y)
{if(x<=0||x>n||y<=0||y>n||Map[x][y])return 0;return 1;
}int fx[10]={-2,-2,-1,1,2,2,1,-1};
int fy[10]={-1,1,2,2,1,-1,-2,-2};int main()
{init();int m,cnt=1;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)num[i][j]=cnt++;S=cnt;T=S+1;for(int i=1;i<=n;i++)for(int j=(i%2==0 ? 2 : 1);j<=n;j+=2)color[i][j]=1;/*    for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%d",color[i][j]);printf("\n");}*/for(int i=1;i<=m;i++){int x,y;scanf("%d %d",&x,&y);Map[x][y]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!Map[i][j]&&color[i][j]){for(int k=0;k<8;k++)if(check(i+fx[k],j+fy[k])){addedge(num[i][j],num[i+fx[k]][j+fy[k]],INF);}}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!Map[i][j]){if(color[i][j])addedge(S,num[i][j],1);elseaddedge(num[i][j],T,1);}printf("%lld\n",(long long)n*n-dinic()-m);return 0;}

View Code

转载于:https://www.cnblogs.com/tian-luo/p/9721302.html

网络流24题-骑士共存问题相关推荐

  1. [COGS746] [网络流24题] 骑士共存

    ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比 时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上 ...

  2. 网络流24题-骑士共存

    题目点这里 题目or在这里 题意就略过了 现将棋盘黑白染色 建立超级源(s)和超级汇(t) edge(s,黑,1) edge(白,t,1) edge(黑,白,1) 考虑s->黑->白-&g ...

  3. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  4. [网络流24题][CODEVS1922]骑士共存问题(最大流)

    问题描述 传送门 题解 首先介绍ATP神犇的做法: 和方格取数3几乎一样,黑白染色,可以发现能攻击到的点颜色不同. 那么从超级源向每一个黑点连边,容量为1,从每一个白点向超级汇连边,容量为1:从黑点向 ...

  5. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  6. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  7. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  8. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

  9. cwl的网络流24题练习

    网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题   3 最小路径覆盖问题  有向图最小路径覆盖,解法都写题目上了 4 魔术球问题  有向图最 ...

  10. 【线性规划和网络流24题】

    (1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...

最新文章

  1. 青少年编程竞赛交流群周报(第038周)
  2. PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
  3. 前端技术分享:什么是MongoDB数据库?
  4. 弹性服务器架构-连接一切的力量
  5. yum 安装报Header V3 DSA signature: NOKEY 的错
  6. python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法
  7. 5个能提高你工作效率的Excel技巧
  8. DPDK-VPP 学习笔记-01
  9. python爬取西刺网代理IP地址
  10. edius裁剪快捷键_edius常用的快捷键有哪些-怎么设置快捷键-edius快捷键使用大全...
  11. golang常量与逻辑运算基本语法
  12. BZOJ 3505: [Cqoi2014]数三角形|组合数学
  13. 阿里云虚拟机转让(RAM创建账户)
  14. 快速合并多个文件内容到一个文件中
  15. hMailServer设置
  16. 数据挖掘:探索性数据分析(EDA)
  17. MathML: 描述数学表达式
  18. 完全背包问题(动态规划)
  19. C# 写入和读取TXT文件
  20. 游玩3ds游戏的N种方法

热门文章

  1. java表示非法参数的异常是_JAVA 的异常那些事
  2. pyspark ml
  3. 图卷积网络详细介绍(三)
  4. Python学习笔记(未完)
  5. Sklearn的聚类算法以及聚类评价指标
  6. OpenCV 图像编解码操作【imencode/imdecode】使用
  7. softmax与sigmoid函数的理解
  8. 2021-06-21属性选择器
  9. NPM 常用命令和参数的意思
  10. zipfian 参数是什么 Zipfian distribution 齐夫定律