zoukankan      html  css  js  c++  java
  • Bzoj 3175: [Tjoi2013]攻击装置

    3175: [Tjoi2013]攻击装置

    Description

    给定一个01矩阵,其中你可以在0的位置放置攻击装置。每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1), (x+1,y+2),(x+2,y+1)
    求在装置互不攻击的情况下,最多可以放置多少个装置。

    Input

    第一行一个整数N,表示矩阵大小为N*N。接下来N行每一行一个长度N的01串,表示矩阵。

    Output

    一个整数,表示在装置互不攻击的情况下最多可以放置多少个装置。

    Sample Input

    3
    010
    000
    100

    Sample Output

    4

    思路:

    欢迎去学一下网络流24题 -- 骑士共存问题, 没了。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int N =5e5+10;
    const int inf = 0x3f3f3f3f;
    #define P(i,j) ((i-1)*m+j)
    int head[N+10],to[N*6+10],val[N*6+10],nxt[N*6+10];
    int cnt = 1;
    int dep[N+10];
    int map[311][311];
    int n,m,s,t;
    int dx[10]={0,-2,-1,+1,+2,-2,-1,+1,+2};
    int dy[10]={0,-1,-2,-2,-1,+1,+2,+2,+1};
    void add_edge(int a,int b,int c) {
    	to[++cnt] = b;
    	nxt[cnt] = head[a];
    	head[a]   = cnt;
    	val[cnt]  = c;
    	
    	to[++cnt] = a;
    	nxt[cnt] = head[b];
    	head[b]   = cnt;
    	val[cnt]  = 0;
    	
    }
    queue<int>q;
    bool bfs() {
    	memset(dep,0,sizeof(dep));
    	while(!q.empty())q.pop();
    	q.push(s);
    	dep[s]=1;
    	while(!q.empty()) {
    		int u=q.front();
    		q.pop();
    		for(int i=head[u];i;i=nxt[i]) {
    			if(!dep[to[i]]&&val[i]) {
    				dep[to[i]]=dep[u]+1;
    				q.push(to[i]);
    			}
    		}
    	}
    	return dep[t]!=0;
    }
    int dfs(int p,int mf) {
    	int nf=0;
    	if(p==t)return mf;
    	for(int i=head[p];i;i=nxt[i]) {
    		if(dep[to[i]]==dep[p]+1&&val[i]) {
    			int tmp=dfs(to[i],min(mf-nf,val[i]));
    			if(!tmp)dep[to[i]]=0;
    			nf+=tmp;
    			val[i]-=tmp;
    			val[i^1]+=tmp;
    			if(nf==mf)break;
    		}
    	}
    	return nf;
    }
    int sum;
    void dinic() {
    	int ans=0;
    	while(bfs()) {
    		//printf("1
    ");
    
    		ans+=dfs(s,inf);
    	}
    	printf("%d
    ",sum-ans);
    }
    int main() {
    	scanf("%d",&n);
    	m = n;
    	s=n*m+1,t=n*m+2;
    	int i,j;
    	for(i=1;i<=n;i++) {
    		for(j=1;j<=m;j++) {
    			scanf("%1d",&map[i][j]);
    			if(!map[i][j]) {
    				if((i+j)%2) {
    					add_edge(s, P(i, j), 1);
    				}
    				else 
    					add_edge(P(i, j), t, 1);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=m;j++) {
    			if(!map[i][j]) {
    				sum++;
    				if((i+j)%2) {
    					for(int k=1;k<=8;k++) {
    						int tx = i + dx[k], ty = j + dy[k];
    						if(map[tx][ty]==0&&tx>0&&tx<=n&&ty>0&&ty<=m) add_edge(P(i, j), P(tx, ty), 1);
    					}
    				}
    			}
    		}
    	}
    	dinic();
    }
    
  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/Tobichi/p/9184722.html
Copyright © 2011-2022 走看看