【网络流24题】骑士共存问题(二分图染色+最大权独立子集+最小割)
2017-08-25 22:17
585 查看
传送门
骑士共存问题I think
同方格取数相同,是最大独立集问题.连边之后,找到一个割,此时与S和T仍然连接的点必然不在一个集合中,点的数量就是答案.要答案尽量大,于是就找出最小割即可.至于如何染色,应当从题给的图中得到启发。Code
#include<cstdio> #include<queue> using namespace std; const int sm = 4e4+10; const int sn = 51e4; const int Inf = 0x3f3f3f3f; int N,K,S,T,tot=1; int to[sn],hd[sm],nxt[sn],c[sn]; int cur[sm],lev[sm]; bool no[205][205]; struct node { int x,y,g; }now; int xx[8] = {2,2,-2,-2,1,-1,1,-1}; int yy[8] = {1,-1,1,-1,2,2,-2,-2}; int Min(int x,int y) { return x<y?x:y; } int Point(int x,int y) { return (x-1)*N+y; } void Add(int u,int v,int w) { to[++tot]=v,nxt[tot]=hd[u],hd[u]=tot,c[tot]=w; to[++tot]=u,nxt[tot]=hd[v],hd[v]=tot,c[tot]=0; } bool chk(int x) { return x>=1&&x<=N; } void Tag() { for(int i=1;i<=N;++i) for(int j=1;j<=N;++j) { if(no[i][j]) continue; if(i%2==j%2) { Add(S,Point(i,j),1); for(int k=0;k<8;++k) if(chk(i+xx[k])&&chk(j+yy[k])&&!no[i+xx[k]][j+yy[k]]) Add(Point(i,j),Point(i+xx[k],j+yy[k]),Inf); } else Add(Point(i,j),T,1); } } bool Bfs() { for(int i=1;i<=T;++i)lev[i]=0; queue<int>q; int t; q.push(S),lev[S]=1; while(!q.empty()) { t=q.front(),q.pop(); for(int i=hd[t];i;i=nxt[i]) if(!lev[to[i]]&&c[i]>0) { lev[to[i]]=lev[t]+1; if(to[i]==T) return 1; q.push(to[i]); } } return 0; } int Dfs(int x,int mx) { if(x==T||!mx) return mx; int f; for(int i=cur[x]?cur[x]:hd[x];i;i=nxt[i]) { cur[x]=i; if(lev[to[i]]==lev[x]+1&&c[i]>0) if(f=Dfs(to[i],Min(mx,c[i]))) return c[i]-=f,c[i^1]+=f,f; } return 0; } void Dinic() { int Flw=0,f; while(Bfs()) { for(int i=1;i<=T;++i)cur[i]=0; while(f=Dfs(S,Inf)) Flw+=f; } printf("%d\n",N*N-K-Flw); } int main() { int u,v; scanf("%d%d",&N,&K); S=N*N+1,T=S+1; for(int i=1;i<=K;++i) { scanf("%d%d",&u,&v); no[u][v]=1; } Tag(); Dinic(); return 0; }
相关文章推荐
- [网络流24题]骑士共存问题 二分图/最大点权独立集
- loj6226「网络流 24 题」骑士共存问题(二分图最大点独立集,最小割)
- 【网络流24题】方格取数(二分图染色+最大权独立点集+最小割)
- [网络流24题] 24 骑士共存(二分图最大独立集,网络最小割)
- 线性规划与网络流24题の24 骑士共存问题 (二分图最大独立集)
- [网络流24题][codevs1922] 骑士共存问题 二分图最大独立集
- 【Codevs1922】骑士共存问题(最小割,二分图最大独立集转最大匹配)
- [网络流24题][CODEVS1922]骑士共存问题(最大流)
- 【网络流二十四题 骑士共存问题】【二分图点权最大独立集->最小割】
- codevs 1922 骑士共存问题||二分图||最大独立集||二分图匹配||Dinic与匈牙利算法的讨论||网络流
- 【网络流24题】骑士共存问题(最大流)
- 【网络流24题24】骑士共存问题
- 二分图的应用:最小覆盖,最小边覆盖,最大独立子集,最小路径覆盖
- 骑士共存问题 (二分图最大匹配 转换 网络最大流 )
- [网络流24题] 03 最小路径覆盖问题(有向无环图最小路径覆盖,网络最大流)
- 【线性规划与网络流24题 24】骑士共存问题
- [luoguP3355] 骑士共存问题(二分图最大独立集)
- [网络流24题] 骑士共存 (二分图)
- 骑士共存问题 二分图的最大独立集
- [网络流 24 题] 方格取数问题 骑士共存问题