• 【雅礼联考DAY02】Revolution


    #include<cstdio>
    #include<queue>
    using namespace std;
    
    const int N = 210 , M = 210000 , INF = 2147483647;
    
    int a[N + 5][N + 5] , b[N + 5][N + 5] , n , m , s , t , ans;
    char str[N + 5];
    int dep[N * N + 5] , cur[N * N + 5] , h[N * N + 5] , tot = 1;
    
    struct edge{
    	int to , nxt , v;
    }e[M + 5];
    
    int fx[4][2] = {-1 , 0 , 0 , -1 , 1 , 0 , 0 , 1};
    
    inline void add(int x , int y , int v)
    {
    	e[++tot].to = y;
    	e[tot].nxt = h[x];
    	e[tot].v = v;
    	h[x] = tot;
    }
    inline void Add(int x , int y , int v) {add(x , y , v) , add(y , x , 0);}
    inline int id(int x , int y) {return (x - 1) * m + y;}
    inline int calc(char ch)
    {
    	if(ch >= '0' && ch <= '9')
    		return ch - '0';
    	if(ch >= 'a' && ch <= 'z')
    		return ch - 'a' + 10;
    	if(ch >= 'A' && ch <= 'Z')
    		return ch - 'A' + 36;
    }
    inline bool pd(int x , int y)
    {
    	if (x <= 0 || y <= 0 || x > n || y > m) return false;
    	return true;
    }
    
    inline int bfs(int s , int t)
    {
    	for(register int i = s; i <= t; i++) dep[i] = 0 , cur[i] = h[i];
    	queue<int> Q;
    	dep[s] = 1;
    	Q.push(s);
    	while (!Q.empty())
    	{
    		int now = Q.front();
    		Q.pop();
    		for(register int i = h[now]; i; i = e[i].nxt)
    		{
    			int v = e[i].to;
    			if (e[i].v == 0 || dep[v] != 0) continue;
    			dep[v] = dep[now] + 1;
    			Q.push(v);
    		}
    	}
    	return dep[t];
    }
    
    inline int dfs(int x , int fa , int mi)
    {
    	if (x == t || mi <= 0) return mi;
    	int flow = 0;
    	for(register int i = cur[x]; i; i = e[i].nxt)
    	{
    		cur[x] = i;
    		int v = e[i].to;
    		if (v == fa || dep[x] + 1 != dep[v] || e[i].v == 0) continue;
    		int f = dfs(v , x , min(mi , e[i].v));
    		if (f <= 0) continue;
    		mi -= f , e[i].v -= f , e[i ^ 1].v += f , flow += f;
    		if (mi <= 0) break;
    	}
    	return flow;
    }
    
    inline int dinic(int s , int t)
    {
    	int res = 0;
    	while (bfs(s , t)) res += dfs(s , 0 , INF);
    	return res;
    }
    
    inline void build()
    {
    	for(register int i = 1; i <= n; i++)
    		for(register int j = 1; j <= m; j++)
    		{
    			int x = id(i , j);
    			if ((i + j) & 1)
    			{
    				Add(3 * x , 3 * x + 1 , b[i][j]);
    				Add(3 * x + 1 , 3 * x + 2 , a[i][j]);
    				Add(3 * x + 2 , t , INF);
    			}
    			else{
    				Add(s , 3 * x , INF);
    				Add(3 * x , 3 * x + 1 , a[i][j]);
    				Add(3 * x + 1 , 3 * x + 2 , b[i][j]);
    				for(register int k = 0; k < 4; k++)
    				{
    					int xx = i + fx[k][0] , yy = j + fx[k][1];
    					if (!pd(xx , yy)) continue;
    					int y = id(xx , yy);
    					Add(3 * x + 1 , 3 * y , INF);
    					Add(3 * x + 2 , 3 * y + 1 , INF);
    				}
    			}
    		}
    }
    
    int main()
    {
    //	freopen("Revolution.in" , "r" , stdin);
    	scanf("%d%d" , &n , &m);
    	t = id(n , m) * 3 + 3;
    	for(register int i = 1; i <= n; i++)
    	{
    		scanf("%s" , str + 1);
    		for(register int j = 1; j <= m; j++)
    			a[i][j] = calc(str[j]);
    	}
    	for(register int i = 1; i <= n; i++)
    	{
    		scanf("%s" , str + 1);
    		for(register int j = 1; j <= m; j++)
    			b[i][j] = calc(str[j]) , ans += b[i][j];
    	}
    	build();
    	printf("%d" , ans - dinic(s , t));
    }
    
  • 相关阅读:
    Mysql索引类型
    Linux 查看进程
    Element is not clickable at point error in chrome
    org.apache.commons.lang.StringUtils 中 Join 函数
    接口测试之webservice介绍
    Java 中正确使用 hashCode 和 equals 方法
    HTTP协议基础
    使用Groovy处理SoapUI中Json response
    SoapUI中读取法文字符
    SoapUI中XML解析
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/12337075.html
Copyright © 2020-2023  润新知