[网络流24题]骑士共存问题 二分图/最大点权独立集
来源:互联网 发布:centos ftp客户端 编辑:程序博客网 时间:2024/05/16 11:59
题目链接
把棋盘黑白染色,构建二分图,然后s点连黑1 ,黑连白INF ,白连t 1,注意黑白相连为一步可达
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 41000;const int MAXM = 10000010;const int INF = 0x3f3f3f3f;//const ll MOD = 998244353;int dir[8][2]={ {2,1},{-2,1},{2,-1},{-2,-1} , {1,2},{1,-2},{-1,2},{-1,-2} };inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}struct Edge{ int from, to, cap, flow, next;};Edge edge[MAXM];int head[MAXN], cur[MAXN], edgenum;int dist[MAXN];bool vis[MAXN];int N, M,ss,tt;void init(){ edgenum = 0; memset(head, -1, sizeof(head));}void addEdge(int u, int v, int w){ Edge E1 = {u, v, w, 0, head[u]}; edge[edgenum] = E1; head[u] = edgenum++; Edge E2 = {v, u, 0, 0, head[v]}; edge[edgenum] = E2; head[v] = edgenum++;}bool BFS(int s, int t){ queue<int> Q; memset(dist, -1, sizeof(dist)); memset(vis, false, sizeof(vis)); dist[s] = 0; vis[s] = true; Q.push(s); while(!Q.empty()) { int u = Q.front(); Q.pop(); for(int i = head[u]; i != -1; i = edge[i].next) { Edge E = edge[i]; if(!vis[E.to] && E.cap > E.flow) { dist[E.to] = dist[u] + 1; if(E.to == t) return true; vis[E.to] = true; Q.push(E.to); } } } return false;}int DFS(int x, int a, int t){ if(x == t || a == 0) return a; int flow = 0, f; for(int &i = cur[x]; i != -1; i = edge[i].next) { Edge &E = edge[i]; if(dist[E.to] == dist[x] + 1 && (f = DFS(E.to, min(a, E.cap - E.flow), t)) > 0) { edge[i].flow += f; edge[i^1].flow -= f; flow += f; a -= f; if(a == 0) break; } } return flow;}int Maxflow(int s, int t){ int flow = 0; while(BFS(s, t)) { memcpy(cur, head, sizeof(head)); flow += DFS(s, INF, t); } return flow;}int mm[205][205];int m,n;int u,v;int getnum(int x,int y){ return (x-1)*n+y;}void dfs(int curx,int cury,int now){ mm[curx][cury] = now; for(int i=0 ;i<8;i++) { int xx = curx + dir[i][0]; int yy = cury + dir[i][1]; if(xx<1||xx>n||yy<1||yy>n||mm[xx][yy]) { continue; } if(now==2) {// addEdge(getnum(curx,cury),getnum(xx,yy),INF); dfs(xx,yy,3); } else {// addEdge(getnum(xx,yy),getnum(curx,cury),INF); dfs(xx,yy,2); } }}int main(){// freopen("data.txt","r",stdin); ios_base::sync_with_stdio(false); cin >> n>>m; init(); int s = 0; int t = n*n+1; for(int i=0;i<m;i++) { cin >> u>>v; mm[u][v]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mm[i][j]==0) { dfs(i,j,2); } } }// for(int i=1;i<=n;i++)// {// for(int j=1;j<=n;j++)// {// cout << mm[i][j]<<" ";// }// cout <<endl;// } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mm[i][j]==2) { addEdge(s,getnum(i,j),1); for(int d=0 ;d<8;d++) { int xx = i + dir[d][0]; int yy = j + dir[d][1]; if(xx<1||xx>n||yy<1||yy>n) { continue; } if(mm[xx][yy]==3) { addEdge(getnum(i,j),getnum(xx,yy),INF); } } } if(mm[i][j]==3) { addEdge(getnum(i,j),t,1); } } } cout << n*n-m-Maxflow(s,t)<<endl; return 0;}
阅读全文
0 0
- [网络流24题]骑士共存问题 二分图/最大点权独立集
- loj6226「网络流 24 题」骑士共存问题(二分图最大点独立集,最小割)
- [网络流24题][codevs1922] 骑士共存问题 二分图最大独立集
- [网络流24题] 24 骑士共存(二分图最大独立集,网络最小割)
- 线性规划与网络流24题の24 骑士共存问题 (二分图最大独立集)
- 【网络流二十四题 骑士共存问题】【二分图点权最大独立集->最小割】
- 骑士共存问题 二分图的最大独立集
- codevs 1922 骑士共存问题||二分图||最大独立集||二分图匹配||Dinic与匈牙利算法的讨论||网络流
- 【网络流24题】骑士共存问题(二分图染色+最大权独立子集+最小割)
- 【COGS】746 [网络流24题] 骑士共存 最大独立集
- 网络流24题之二十四 骑士共存 最大独立集
- Cogs 746. [网络流24题] 骑士共存(最大独立集)
- 骑士共存问题 (二分图最大匹配 转换 网络最大流 )
- 【网络流24题】骑士共存问题
- [网络流24题]骑士共存问题
- wikioi 1922 骑士共存问题 最大独立集
- [网络流24题][CODEVS1922]骑士共存问题(最大流)
- 【loj】#6007. 「网络流 24 题」方格取数(二分图最大点权独立集)
- JDBC笔记
- [微信小程序]时间戳转日期
- Qt常用类QWidget
- 抢数游戏及其演绎
- eigenface
- [网络流24题]骑士共存问题 二分图/最大点权独立集
- C语言volatile关键字
- Git常用命令汇总
- Semantic Compositional Networks for Visual Captioning
- 实现select change 点击重复内容无法触发问题
- XML中输入特殊符号
- 解决:win10下VS2010中文输入法输入英文出现BUG
- 如何删除一条数据
- 理论与问题的关系