• [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴


    [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

    试题描述

    在一个 (r)(c) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为 (1),蜥蜴的跳跃距离是 (d),即蜥蜴可以跳到平面距离不超过 (d) 的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减 (1)(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为 (1),则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

    输入

    输入第一行为三个整数 (r)(c)(d),即地图的规模与最大跳跃距离。以下 (r) 行为石竹的初始状态,(0) 表示没有石柱,(1)~(3) 表示石柱的初始高度。以下 (r) 行为蜥蜴位置,L 表示蜥蜴,. 表示没有蜥蜴。

    输出

    输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

    输入示例

    5 8 2
    00000000
    02000000
    00321100
    02000000
    00000000
    ........
    ........
    ..LLLL..
    ........
    ........
    

    输出示例

    1
    

    数据规模及约定

    (100 exttt{%}) 的数据满足:(1 le r, c le 20, 1 le d le 4)

    题解

    点带容量的最大流。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <algorithm>
    using namespace std;
    #define rep(i, s, t) for(int i = (s); i <= (t); i++)
    #define dwn(i, s, t) for(int i = (s); i >= (t); i--)
    
    int read() {
    	int x = 0, f = 1; char c = getchar();
    	while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
    	while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
    	return x * f;
    }
    
    #define maxn 810
    #define maxm 322410
    #define oo 2147483647
    
    struct Edge {
    	int from, to, flow;
    	Edge() {}
    	Edge(int _1, int _2, int _3): from(_1), to(_2), flow(_3) {}
    };
    struct Dinic {
    	int n, m, s, t, head[maxn], nxt[maxm];
    	Edge es[maxm];
    	int vis[maxn], Q[maxn], hd, tl;
    	int cur[maxn];
    	
    	void init() {
    		m = 0; memset(head, -1, sizeof(head));
    		return ;
    	}
    	void setn(int _) {
    		n = _;
    		return ;
    	}
    	
    	void AddEdge(int a, int b, int c) {
    		es[m] = Edge(a, b, c); nxt[m] = head[a]; head[a] = m++;
    		es[m] = Edge(b, a, 0); nxt[m] = head[b]; head[b] = m++;
    		return ;
    	}
    	
    	bool BFS() {
    		memset(vis, 0, sizeof(vis));
    		vis[t] = 1;
    		hd = tl = 0; Q[++tl] = t;
    		while(hd < tl) {
    			int u = Q[++hd];
    			for(int i = head[u]; i != -1; i = nxt[i]) {
    				Edge& e = es[i^1];
    				if(!vis[e.from] && e.flow) {
    					vis[e.from] = vis[u] + 1;
    					Q[++tl] = e.from;
    				}
    			}
    		}
    		return vis[s] > 0;
    	}
    	
    	int DFS(int u, int a) {
    		if(u == t || !a) return a;
    		int flow = 0, f;
    		for(int& i = cur[u]; i != -1; i = nxt[i]) {
    			Edge& e = es[i];
    			if(vis[e.to] == vis[u] - 1 && (f = DFS(e.to, min(a, e.flow)))) {
    				flow += f; a -= f;
    				e.flow -= f; es[i^1].flow += f;
    				if(!a) return flow;
    			}
    		}
    		return flow;
    	}
    	
    	int MaxFlow(int _s, int _t) {
    		s = _s; t = _t;
    		int flow = 0;
    		while(BFS()) {
    			rep(i, 1, n) cur[i] = head[i];
    			flow += DFS(s, oo);
    		}
    		return flow;
    	}
    } sol;
    
    #define maxr 25
    
    int CntP;
    struct Point {
    	int id;
    	Point(): id(0) {}
    	int p() { return id ? id : id = ++CntP; }
    } In[maxr][maxr], Out[maxr][maxr], S, T;
    char Map[maxr][maxr], Liz[maxr][maxr];
    
    int main() {
    	int r = read(), c = read(), d = read();
    	rep(i, 1, r) scanf("%s", Map[i] + 1);
    	rep(i, 1, r) scanf("%s", Liz[i] + 1);
    	
    	int cnt = 0;
    	sol.init();
    	rep(i, 1, r) rep(j, 1, c) {
    		if(Liz[i][j] == 'L') sol.AddEdge(S.p(), In[i][j].p(), 1), cnt++;
    		if(Map[i][j] > '0') {
    			sol.AddEdge(In[i][j].p(), Out[i][j].p(), Map[i][j] - '0');
    			rep(x, 1, r) rep(y, 1, c)
    				if((i != x || j != y) && (i - x) * (i - x) + (j - y) * (j - y) <= d * d)
    					sol.AddEdge(Out[i][j].p(), In[x][y].p(), oo);
    			if(min(min(i, j), min(r + 1 - i, c + 1 - j)) <= d) sol.AddEdge(Out[i][j].p(), T.p(), oo);
    		}
    	}
    	S.p(); T.p();
    	sol.setn(CntP);
    	
    	printf("%d
    ", cnt - sol.MaxFlow(S.p(), T.p()));
    	
    	return 0;
    }
    
  • 相关阅读:
    HDU 3709 Balanced Number
    HDU 3652 B-number
    HDU 3555 Bomb
    全局和局部内存管理
    [转]
    [转]
    [转]
    The Stable Marriage Problem
    STL各种容器的使用时机详解
    Qt中图像的显示与基本操作
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/7905671.html
Copyright © 2020-2023  润新知