zoukankan      html  css  js  c++  java
  • [BZOJ1976][BeiJing2010组队]能量魔方 Cube

    dbzoj

    Description

    小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量。 能量魔方是一个 NNN 的立方体,一共用 N3 个空格可以填充能量水晶。 能量水晶有两种: ·一种是正能量水晶(Positive) ·一种是负能量水晶(Negative) 当这个魔方被填满后,就会依据填充的能量水晶间的关系产生巨大能量。对 于相邻两(相邻就是拥有同一个面)的两个格子,如果这两个格子填充的是一正一 负两种水晶,就会产生一单位的能量。而整个魔方的总能量,就是这些产生的能 量的总和。 现在,小 C 已经在魔方中填充了一些水晶,还有一些位置空着。他想知道, 如果剩下的空格可以随意填充,那么在最优情况下,这个魔方可以产生多少能量。

    Input

    第一行包含一个数N,表示魔方的大小。 接下来 N2 行,每行N个字符,每个字符有三种可能: P:表示此方格已经填充了正能量水晶; N:表示此方格已经填充了负能量水晶; ?:表示此方格待填充。 上述 NN 行,第(i-1)N+1~i*N 行描述了立方体第 i 层从前到后,从左到右的 状态。且每 N 行间,都有一空行分隔。

    Output

    仅包含一行一个数,表示魔方最多能产生的能量

    Sample Input

    2
    P?
    ??

    ??
    N?

    Sample Output

    9

    HINT

    如下状态时,可产生最多的能量。
    PN
    NP

    NP
    NN

    【数据规模】

    10% 的数据N≤3;
    30% 的数据N≤4;
    80% 的数据N≤10;
    100% 的数据N≤40。

    sol

    相邻不同色产生贡献?
    把一种颜色的放在(S)这边,另一种颜色的放在(T)这边,然后。。。
    最大割?什么鬼啊。
    这种求收益最大的问题不妨转成总收益减去最小损失。
    我们先假设已经让所有有公共面的块异色了。这样先算总收益,然后再减去相邻同色的最少数目。
    相邻同色?黑白染色一下即可。
    对于(x+y+z)为奇数的点,向其相邻的点(一定会是(x+y+z)为偶数的点),连双向容量为1的边。
    然后对于已经确定了颜色的点,直接根据奇偶性以及黑白染色情况与(S)(T)(inf)边。

    code

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    int gi()
    {
    	int x=0,w=1;char ch=getchar();
    	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    	if (ch=='-') w=0,ch=getchar();
    	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return w?x:-x;
    }
    const int N = 65000;
    const int inf = 1e9;
    struct edge{int to,nxt,w;}a[N*20];
    int n,id[50][50][50],tot,S,T,head[N],cnt=1,dep[N],cur[N],ans;
    char map[50][50][50];
    queue<int>Q;
    void link(int u,int v,int w)
    {
    	a[++cnt]=(edge){v,head[u],w};
    	head[u]=cnt;
    	a[++cnt]=(edge){u,head[v],w};
    	head[v]=cnt;
    }
    bool bfs()
    {
    	memset(dep,0,sizeof(dep));
    	dep[S]=1;Q.push(S);
    	while (!Q.empty())
    	{
    		int u=Q.front();Q.pop();
    		for (int e=head[u];e;e=a[e].nxt)
    			if (a[e].w&&!dep[a[e].to])
    				dep[a[e].to]=dep[u]+1,Q.push(a[e].to);
    	}
    	return dep[T];
    }
    int dfs(int u,int f)
    {
    	if (u==T) return f;
    	for (int &e=cur[u];e;e=a[e].nxt)
    		if (a[e].w&&dep[a[e].to]==dep[u]+1)
    		{
    			int tmp=dfs(a[e].to,min(a[e].w,f));
    			if (tmp) {a[e].w-=tmp;a[e^1].w+=tmp;return tmp;}
    		}
    	return 0;
    }
    int Dinic()
    {
    	int res=0;
    	while (bfs())
    	{
    		for (int i=1;i<=T;++i) cur[i]=head[i];
    		while (int tmp=dfs(S,inf)) res+=tmp;
    	}
    	return res;
    }
    int main()
    {
    	n=gi();
    	for (int i=1;i<=n;++i)
    		for (int j=1;j<=n;++j)
    			for (int k=1;k<=n;++k)
    			{
    				char ch=getchar();
    				while (ch!='P'&&ch!='N'&&ch!='?') ch=getchar();
    				map[i][j][k]=ch;id[i][j][k]=++tot;
    			}
    	S=++tot,T=++tot;
    	for (int i=1;i<=n;++i)
    		for (int j=1;j<=n;++j)
    			for (int k=1;k<=n;++k)
    				if ((i+j+k)&1)
    				{
    					if (map[i][j][k]=='P') link(S,id[i][j][k],inf);
    					if (map[i][j][k]=='N') link(id[i][j][k],T,inf);
    					if (i>1) link(id[i][j][k],id[i-1][j][k],1),++ans;
    					if (i<n) link(id[i][j][k],id[i+1][j][k],1),++ans;
    					if (j>1) link(id[i][j][k],id[i][j-1][k],1),++ans;
    					if (j<n) link(id[i][j][k],id[i][j+1][k],1),++ans;
    					if (k>1) link(id[i][j][k],id[i][j][k-1],1),++ans;
    					if (k<n) link(id[i][j][k],id[i][j][k+1],1),++ans;
    				}
    				else
    				{
    					if (map[i][j][k]=='P') link(id[i][j][k],T,inf);
    					if (map[i][j][k]=='N') link(S,id[i][j][k],inf);					
    				}
    	printf("%d
    ",ans-Dinic());
    	return 0;
    }
    
  • 相关阅读:
    docker 安装mysql
    Java web项目搭建系列之二 Jetty下运行项目
    Java web项目搭建系列之一 Eclipse中新建Maven项目
    Maven 添加其他Maven组件配置问题
    C# 中定义扩展方法
    Oracle 函数
    【Webservice】2 counts of IllegalAnnotationExceptions Two classes have the same XML type name
    Linux精简版系统安装网络配置问题解决
    Rsync 故障排查整理
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8710773.html
Copyright © 2011-2022 走看看