codevs1022覆盖

ONION_CYC ONION_CYC     2022-08-23     360

关键词:

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

【题解】对i+j进行奇偶染色,就可以保证相邻两格异色。

然后就是二分图了,对相邻格子连边跑最大流即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110,maxN=10100,inf=0x3f3f3f3f;
struct edge{int from,v,flow;}e[300010];
int n,m,k,tot=1,first[maxN],p[maxn][maxn],cnt,d[maxN],q[1010],S,T,cur[maxN];
long long ans;
void insert(int u,int v,int flow)
{
    tot++;e[tot].v=v;e[tot].flow=flow;e[tot].from=first[u];first[u]=tot;
    tot++;e[tot].v=u;e[tot].flow=0;e[tot].from=first[v];first[v]=tot;
}
bool bfs()
{
    memset(d,-1,sizeof(d));
    int head=0,tail=1;q[0]=S;d[0]=0;
    while(head!=tail)
     {
         int x=q[head++];if(head>=1001)head=0;
         for(int i=first[x];i;i=e[i].from)
          if(e[i].flow&&d[e[i].v]==-1)
           {
               d[e[i].v]=d[x]+1;
               q[tail++]=e[i].v;if(tail>=1001)tail=0;
           }
     }
    return d[T]!=-1;
}
int dfs(int x,int a)
{
    if(x==T||a==0)return a;
    int flow=0,f;
    for(int i=first[x];i;i=e[i].from)
     if(d[e[i].v]==d[x]+1&&(f=dfs(e[i].v,min(a,e[i].flow)))>0)
      {
          e[i].flow-=f;
          e[i^1].flow+=f;
          a-=f;
          flow+=f;
          if(a==0)break;
      }
    return flow;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    S=0;
    for(int i=1;i<=k;i++)
     {
         int u,v;
         scanf("%d%d",&u,&v);
         p[u][v]=-1;
     }
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      {
          if(p[i][j]!=-1)
           {
               p[i][j]=++cnt;
           }
      }
    T=++cnt;
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      {
          if(p[i][j]!=-1)
           {
               if((i+j)&1)
                {
                    if(i>1&&p[i-1][j]>0)insert(p[i][j],p[i-1][j],1);
                   if(i<n&&p[i+1][j]>0)insert(p[i][j],p[i+1][j],1);
                   if(j>1&&p[i][j-1]>0)insert(p[i][j],p[i][j-1],1);
                   if(j<n&&p[i][j+1]>0)insert(p[i][j],p[i][j+1],1);
                   insert(S,p[i][j],1);
                }
               else insert(p[i][j],T,1);
           }
      }
    ans=0;
    while(bfs())
     {
         for(int i=0;i<=tot;i++)cur[i]=first[i];
         ans+=dfs(S,inf);
     }
    printf("%lld",ans);
    return 0;
}
View Code

 

codevs1022覆盖(匈牙利算法)

嗯,先上题目描述。。。此题接近裸的匈牙利算法,将陆地和其四周是陆地的点连一条边,这样就有了一个无向图。接着就是从第一个点出发枚举未被标记的点,标记与其对应的另一个点(因为是1*2的长方形)。开了一个四维数... 查看详情

匈牙利算法实战codevs1022覆盖(代码片段)

 1022覆盖  时间限制:1s 空间限制:128000KB 题目等级:大师Master题解 查看运行结果  题目描述 Description有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用1×2的矩阵区... 查看详情

code[vs]1022覆盖题解

Code[VS]1022覆盖题解 HungaryAlgorithm题目传送门:Code[VS]1022题目描述 Description有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,... 查看详情

codevs3027线段覆盖2

题目大意:http://codevs.cn/problem/3027/ 源码:#include<iostream>usingnamespacestd;struct{intx,y,val;}tmp[1050];intdp[1050]={0};intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>tmp[i] 查看详情

codevs1214线段覆盖

1214线段覆盖 时间限制:1s空间限制:128000KB题目等级:黄金Gold 题目描述Description   给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整... 查看详情

codevs1214线段覆盖

1214线段覆盖 时间限制:1s 空间限制:128000KB 题目等级:黄金Gold 题目描述 Description   给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999... 查看详情

codevs3027线段覆盖2

3027线段覆盖2  时间限制:1s 空间限制:128000KB 题目等级:黄金Gold题解   题目描述 Description数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若... 查看详情

codevs1643线段覆盖3

1643线段覆盖3  时间限制:2s 空间限制:256000KB 题目等级:黄金Gold题解   题目描述 Description在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k... 查看详情

codevs1214线段覆盖题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。题目链接:http://codevs.cn/problem/1214/题目描述Description   给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,&hellip... 查看详情

codevs1214线段覆盖

...是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是 查看详情

codevs2171棋盘覆盖

...第x行y为第y列输出描述 OutputDescription一个数,即最大覆盖格数样例输 查看详情

codevs1643线段覆盖3[贪心]

1643线段覆盖3   时间限制:2s  空间限制:256000KB  题目等级:黄金Gold题解   题目描述 Description在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合)... 查看详情

codevs2171棋盘覆盖

...第x行y为第y列输出描述 OutputDescription一个数,即最大覆盖格数样例输 查看详情

线段覆盖4(codevs3012)

...,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。输入描述 InputDescription第一行一个整数n,表示有多少条线段。接下来n行每行三个整数,aibici,分别代表第i条线段的左端点ai... 查看详情

codeves1214线段覆盖

思路:排序之后,对于当前这个ri,看是否能找到li1#include<bits/stdc++.h>2usingnamespacestd;34structnode{5intx,y,z;6}a[2002];78boolcmp(nodep,nodeq){9if(p.x==q.x)returnp.y<q.y;10returnp.x<q.x;11}12set<int>ss 查看详情

codevs1214线段覆盖

...是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至 查看详情

20171111codevs1214线段覆盖

...是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是 查看详情

贪心codevs1214:线段覆盖

...是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是 查看详情