zoukankan      html  css  js  c++  java
  • 【刷题】LOJ 6226 「网络流 24 题」骑士共存问题

    题目描述

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

    pic

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

    输入格式

    第一行有两个正整数 ( ext{n})( ext{m}) (( 1 leq n leq 200, 0 leq m leq n^2 - 1 )) 分别表示棋盘的大小和障碍数。

    输出格式

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

    样例

    样例输入

    3 2
    1 1
    3 3
    

    样例输出

    5
    

    数据范围与提示

    (1leq nleq 200)

    (0 leq m leq n^2-1)

    题解

    一个点与它能攻击到的点连边

    变成了一个二分图

    那么题目要求的就是二分图最大独立集

    最大独立集 (=) 点数 (-) 最大流

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=200+10,inf=0x3f3f3f3f;
    int n,m,tot,e=1,col[MAXN][MAXN],dr[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}},s,t,to[MAXN*MAXN<<4],nex[MAXN*MAXN<<4],beg[MAXN*MAXN],cap[MAXN*MAXN<<4],cur[MAXN*MAXN],vis[MAXN*MAXN],level[MAXN*MAXN],clk;
    std::queue<int> q;
    template<typename T> inline void read(T &x)
    {
        T data=0,w=1;
        char ch=0;
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')w=-1,ch=getchar();
        while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
        x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
        if(x<0)putchar('-'),x=-x;
        if(x>9)write(x/10);
        putchar(x%10+'0');
        if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline int id(int x,int y)
    {
        return (x-1)*n+y;
    }
    inline void insert(int x,int y,int z)
    {
        to[++e]=y;
        nex[e]=beg[x];
        beg[x]=e;
        cap[e]=z;
        to[++e]=x;
        nex[e]=beg[y];
        beg[y]=e;
        cap[e]=0;
    }
    inline bool bfs()
    {
        memset(level,0,sizeof(level));
        level[s]=1;
        q.push(s);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(register int i=beg[x];i;i=nex[i])
                if(!level[to[i]]&&cap[i])level[to[i]]=level[x]+1,q.push(to[i]);
        }
        return level[t];
    }
    inline int dfs(int x,int maxflow)
    {
        if(x==t||!maxflow)return maxflow;
        vis[x]=clk;
        int res=0;
        for(register int &i=cur[x];i;i=nex[i])
            if((vis[to[i]]^vis[x])&&cap[i]&&level[to[i]]==level[x]+1)
            {
                int f=dfs(to[i],min(maxflow,cap[i]));
                res+=f;
                cap[i]-=f;
                cap[i^1]+=f;
                maxflow-=f;
                if(!maxflow)break;
            }
        vis[x]=0;
        return res;
    }
    inline int Dinic()
    {
        int res=0;
        while(bfs())clk++,memcpy(cur,beg,sizeof(cur)),res+=dfs(s,inf);
        return res;
    }
    int main()
    {
        read(n);read(m);tot=n*n;
        for(register int i=1;i<=n;++i)
            for(register int j=1;j<=n;++j)
                if((i+j)&1)col[i][j]=1;
                else col[i][j]=2;
        for(register int i=1,x,y;i<=m;++i)read(x),read(y),col[x][y]=0,tot--;
        s=n*n+1,t=s+1;
        for(register int i=1;i<=n;++i)
            for(register int j=1;j<=n;++j)
                if(!col[i][j])continue;
                else if(col[i][j]==2)
                {
                    insert(s,id(i,j),1);
                    for(register int k=0;k<8;++k)
                    {
                        int dx=i+dr[k][0],dy=j+dr[k][1];
                        if(dx<0||dx>n||dy<0|dy>n||col[dx][dy]!=1)continue;
                        insert(id(i,j),id(dx,dy),1);
                    }
                }
                else insert(id(i,j),t,1);
        write(tot-Dinic(),'
    ');
        return 0;
    }
    
  • 相关阅读:
    字符编码 乱码问题
    Django ORM那些相关操作
    pymysql模块使用---Python连接MySQL数据库
    数据库MySQL 之 索引原理与慢查询优化
    数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
    数据库 MySQL 之 数据操作
    数据库 MySQL 之 表操作、存储引擎
    [BZOJ 4212]神牛的养成计划(Trie+可持久化Trie)
    [LuoguP4094] [HEOI2016] [TJOI2016]字符串(二分答案+后缀数组+ST表+主席树)
    [BZOJ 2865]字符串识别(后缀数组+线段树)
  • 原文地址:https://www.cnblogs.com/hongyj/p/9443243.html
Copyright © 2011-2022 走看看