BZOJ1976: [BeiJing2010組隊]能量魔方 Cube

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   ar   for   

1976: [BeiJing2010組隊]能量魔方 CubeTime Limit: 10 Sec  Memory Limit: 64 MB
Submit: 832  Solved: 281
[Submit][Status]Description小C 有一個能量魔方,這個魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以產生巨大的能量。 能量魔方是一個 N*N*N 的立方體,一共用 N3 個空格可以填充能量水晶。 能量水晶有兩種: ·一種是正能量水晶(Positive) ·一種是負能量水晶(Negative) 當這個魔方被填滿後,就會依據填充的能量水晶間的關係產生巨大能量。對 於相鄰兩(相鄰就是擁有同一個面)的兩個格子,如果這兩個格子填充的是一正一 負兩種水晶,就會產生一單位的能量。而整個魔方的總能量,就是這些產生的能 量的總和。 現在,小 C 已經在魔方中填充了一些水晶,還有一些位置空著。他想知道, 如果剩下的空格可以隨意填充,那麼在最優情況下,這個魔方可以產生多少能量。Input第一行包含一個數N,表示魔方的大小。 接下來 N2 行,每行N個字元,每個字元有三種可能: P:表示此方格已經填充了正能量水晶; N:表示此方格已經填充了負能量水晶; ?:表示此方格待填充。 上述 N*N 行,第(i-1)*N+1~i*N 行描述了立方體第 i 層從前到後,從左至右的 狀態。且每 N 行間,都有一空行分隔。Output僅包含一行一個數,表示魔方最多能產生的能量Sample Input2
P?
??

??
N? Sample Output9HINT

如下狀態時,可產生最多的能量。 
PN 
NP 

NP 
NN 

【資料規模】 
10% 的資料N≤3; 
30% 的資料N≤4; 
80% 的資料N≤10; 
100% 的資料N≤40。 

Source

題解:

這題做的我也是醉了。。。

類似於上一題圈地計劃,我們可以二分圖染色,然後黑點s正t負,白點s負t正,已經確定黑白的點向相應點連inf的邊,表示它必須歸在這個割中

然後其他相鄰點之間連容量為1的邊,為無向邊。(但是為了方便,可以黑白點各添加一條有向邊。)

然後就ok了,有向無向的問題還需深究。(因為只會扣一次所以ans>>1)

代碼:

  1 #include<cstdio>  2 #include<cstdlib>  3 #include<cmath>  4 #include<cstring>  5 #include<algorithm>  6 #include<iostream>  7 #include<vector>  8 #include<map>  9 #include<set> 10 #include<queue> 11 #include<string> 12 #define inf 1000000000 13 #define maxn 100000 14 #define maxm 3000000 15 #define eps 1e-10 16 #define ll long long 17 #define pa pair<int,int> 18 #define FOR for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++) 19 #define mod 1000000007 20 using namespace std; 21 inline int read() 22 { 23     int x=0,f=1;char ch=getchar(); 24     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 25     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();} 26     return x*f; 27 } 28 int  n,m,s,t,maxflow,tot=1,ans,mark[50][50][50],head[maxn],cur[maxn],h[maxn],q[maxn]; 29 struct edge{int go,next,v;}e[maxm]; 30 void ins(int x,int y,int z){e[++tot].go=y;e[tot].v=z;e[tot].next=head[x];head[x]=tot;} 31 void insert(int x,int y,int z){ins(x,y,z);ins(y,x,0);} 32 void ins2(int x,int y,int z){insert(x,y,z);insert(y,x,z);} 33 bool bfs() 34 { 35     for(int i=s;i<=t;i++)h[i]=-1; 36     int l=0,r=1;q[1]=s;h[s]=0; 37     while(l<r) 38     { 39         int x=q[++l]; 40         for(int i=head[x];i;i=e[i].next) 41          if(e[i].v&&h[e[i].go]==-1) 42          { 43             h[e[i].go]=h[x]+1;q[++r]=e[i].go; 44          } 45     } 46     return h[t]!=-1; 47 } 48 int dfs(int x,int f) 49 { 50     if(x==t) return f; 51     int tmp,used=0; 52     for(int i=head[x];i;i=e[i].next) 53      if(e[i].v&&h[e[i].go]==h[x]+1) 54     { 55         tmp=dfs(e[i].go,min(e[i].v,f-used)); 56         e[i].v-=tmp;if(e[i].v)cur[x]=i; 57         e[i^1].v+=tmp;used+=tmp; 58         if(used==f)return f;        59     } 60     if(!used) h[x]=-1; 61     return used; 62 } 63 void dinic() 64 { 65     maxflow=0; 66     while(bfs()) 67     { 68         for (int i=s;i<=t;i++)cur[i]=head[i];maxflow+=dfs(s,inf); 69     } 70 } 71 int get() 72 { 73     char ch=‘ ‘; 74     while(ch!=‘?‘&&ch!=‘P‘&&ch!=‘N‘)ch=getchar(); 75     if(ch==‘?‘)return 0;else if(ch==‘P‘)return 1;else return 2; 76 }     77 int main() 78 { 79     freopen("input.txt","r",stdin); 80     freopen("output.txt","w",stdout); 81     n=read(); 82     FOR mark[i][j][k]=(i-1)*n*n+(j-1)*n+k; 83     s=0;t=mark[n][n][n]+1; 84     FOR 85     { 86         int x=get(); 87         if((i+j+k)&1) 88         { 89         if(x==1)insert(s,mark[i][j][k],inf); 90         else if(x==2)insert(mark[i][j][k],t,inf); 91         } 92         else 93         { 94         if(x==1)insert(mark[i][j][k],t,inf); 95         else if(x==2)insert(s,mark[i][j][k],inf); 96         } 97         int res=0; 98         if(i<n)insert(mark[i][j][k],mark[i+1][j][k],1),ans++; 99         if(i>1)insert(mark[i][j][k],mark[i-1][j][k],1),ans++;100         if(j<n)insert(mark[i][j][k],mark[i][j+1][k],1),ans++;101         if(j>1)insert(mark[i][j][k],mark[i][j-1][k],1),ans++;102         if(k<n)insert(mark[i][j][k],mark[i][j][k+1],1),ans++;103         if(k>1)insert(mark[i][j][k],mark[i][j][k-1],1),ans++;104         //if(!x)insert(s,mark[i][j][k],res),insert(mark[i][j][k],t,res);105     }106     dinic();107     printf("%d\n",(ans>>1)-maxflow);108     return 0;109 }
View Code

 

BZOJ1976: [BeiJing2010組隊]能量魔方 Cube

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.