codevs1922骑士共存问题

ONION_CYC ONION_CYC     2022-08-23     742

关键词:

算法】二分图最大匹配(最大流)

【题解】按(i+j)奇偶性染色后,发现棋子跳到的地方刚好异色。

然后就是二分图了,对于每个奇点向可以跳到的地方连边,偶点不需连(可逆)。

所以题目要求转换为求二分图上最大独立集(对于每条边,至少有一个点不被选中)。

最大独立集=总点数-最小割

//代码略
//hzwer's code:



#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
using namespace std;
int n,m,bl,wt,ans,cnt=1;
bool del[201][201];
int mark[201][201];
int xx[8]={1,1,2,2,-1,-1,-2,-2},
    yy[8]={2,-2,1,-1,2,-2,1,-1};
struct data{int to,next,v;}e[500001];
int head[40002],h[40002];
void insert(int u,int v,int w)
{
     cnt++;
     e[cnt].to=v;
     e[cnt].next=head[u];
     head[u]=cnt;
     e[cnt].v=w;
     cnt++;
     e[cnt].to=u;
     e[cnt].next=head[v];
     head[v]=cnt;
 }
void build()
{
     for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
             if(del[i][j])continue;
             else if(mark[i][j]<bl)
             {
             for(int k=0;k<8;k++)
             {
                     int nowx=i+xx[k],nowy=j+yy[k];
                     if(nowx<1||nowy<1||nowx>n||nowy>n||del[nowx][nowy])continue;
                     insert(mark[i][j],mark[nowx][nowy],INF);
                     }
             insert(0,mark[i][j],1);
             }
             else insert(mark[i][j],wt,1);
 }
bool bfs()
{
     int q[40002],t=0,w=1,i,now;
     memset(h,-1,sizeof(h));
     h[0]=q[0]=0;
     while(t<w)
     {
               now=q[t];t++;
               i=head[now];
               while(i)
               {
                       if(h[e[i].to]==-1&&e[i].v){h[e[i].to]=h[now]+1;q[w++]=e[i].to;}
                       i=e[i].next;
                       }
               }
     if(h[wt]==-1)return 0;
     return 1;
 }
int dfs(int x,int f)
{
    if(x==wt)return f;
    int i=head[x];
    int w,used=0;
    while(i)
    {
            if(e[i].v&&h[e[i].to]==h[x]+1)
            {
                w=f-used;
                w=dfs(e[i].to,min(w,e[i].v));   
                e[i].v-=w;
                e[i^1].v+=w;
                used+=w;
                if(used==f)return f;                      
                }
                i=e[i].next;
            }
    if(!used)h[x]=-1;
    return used;
    }
void dinic(){while(bfs()){ans+=dfs(0,INF);}}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
            int x,y;
            scanf("%d%d",&x,&y);
            del[x][y]=1;
            }
    bl=1,wt=(n*n+1)/2+1;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
          if((i+j)%2==0){mark[i][j]=bl;bl++;}
          else {mark[i][j]=wt;wt++;}
    build();
    dinic();
    printf("%d",n*n-m-ans);
    return 0;
}
View Code

 

codevs1922骑士共存问题(最小割,二分图最大匹配)

题意:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它... 查看详情

网络流24题骑士共存问题(最大流)

【codevs1922】骑士共存问题题目描述 Description在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算... 查看详情

「codves1922」骑士共存问题(二分图的最大独立集|网络流)&dinic

首先是题目链接 http://codevs.cn/problem/1922/结果发现题目没图(心情复杂然后去网上扒了一张图大概就是这样了。如果把每个点和它可以攻击的点连一条边,那问题就变成了求二分图的最大独立集了(二分图最大独立集:即一个... 查看详情

骑士共存问题(代码片段)

骑士共存问题https://www.luogu.org/problemnew/show/P3355题目描述在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入对于给定的n*n个方格的国际象棋棋盘和障碍标志... 查看详情

[网络流24题]骑士共存

746.[网络流24题]骑士共存★★☆  输入文件:knight.in  输出文件:knight.out   简单对比 时间限制:1s  内存限制:128MB 骑士共存问题  «问题描述:  在一个n*n个方格的国际象棋棋盘上,马... 查看详情

p3355骑士共存问题网络流(代码片段)

骑士共存题目描述在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士... 查看详情

骑士共存问题(代码片段)

...心,细心观察他能得到一个很重要的规律:黄色格子上的骑士只能攻击红色格子上的骑士,反之同理。因此,我们可以把棋盘进行黑白染色,然后白点放在图的左侧,黑点在图的右侧,有点像二分图的感觉。接下来切入正题了:... 查看详情

洛谷p3355骑士共存问题

题目描述在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它... 查看详情

[网络流24题]骑士共存问题(代码片段)

...分图最大点独立集问题。要求在棋盘上放最多互不攻击的骑士,即在棋盘中拿走最少的骑士,使得剩下的骑士互不攻击。黄格只能攻击红格,红格也只能攻击黄格,所以考虑建立二分图。源点向所有红格连流量为1的边,所有黄... 查看详情

洛谷[p3355]骑士共存问题

二分图求最大独立点集本问题在二分图中已处理过,此处用dinic写了一遍#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>#include<queue>#include<cstring>usingnamespacestd;constintM 查看详情

[cogs746][网络流24题]骑士共存

...ut  简单对比时间限制:1s  内存限制:128MB骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。«编程任务... 查看详情

ac日记——[网络流24题]骑士共存cogs746

746.[网络流24题]骑士共存★★☆  输入文件:knight.in  输出文件:knight.out   简单对比时间限制:1s  内存限制:128MB骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上,马(... 查看详情

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

骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。«编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算... 查看详情

骑士共存问题(二分图最大独立集)

//http://www.cnblogs.com/IMGavin/#include<iostream>#include<stdio.h>#include<cstdlib>#include<cstring>#include<queue>#include<vector>#include<map>#include< 查看详情

[网络流24题]骑士共存(cogs746)

骑士共存问题?问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。?编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最... 查看详情

洛谷p3355骑士共存问题最小割

同方格取数问题:https://www.cnblogs.com/lokiii/p/8430720.html记得把障碍点去掉,不连边也不计入sum#include<iostream>#include<cstdio>#include<queue>#include<cstring>usingnamespacestd;constintN=100005,inf 查看详情

网络流24题骑士共存问题(最大流)

【网络流24题】骑士共存问题(最大流)题面Cogs题解这题本质上和方格取数问题没有任何区别首先也是可以黑白染色因为马必定会跳到异色点上面去然后同样的,源点向一种颜色,另一种颜色向汇点连边因为代价就是1,所以容... 查看详情

[网络流24题]骑士共存问题

题面:传送门思路:基本上和方格取数问题差不多这道题可以证明,如果把每两个不能共存的点连在一起,那么这个图没有奇环,是一个二分图同时,如果把这个图像国际象棋一样黑白染色,那么连边的两个点颜色不同源点连黑... 查看详情