关键词:
【算法】二分图匹配(最大流)
【题解】对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; }
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)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是 查看详情