[费用流] ACM-ICPC Asia China-Final Contest J. Mr.Panda and TubeMaster
2017-12-16 12:28
507 查看
%%%Manchery
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int N=10010,inf=1<<30; int t,n,m,cnt,S,T,SS,TT,ans,G ,tag ; struct edge{ int t,nx,w,f; }E[N<<2]; #define x(i,j) (((i-1)*m+j)<<1) #define y(i,j) (((i-1)*m+j)<<1|1) inline void add(int x,int y,int f,int w){ E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt; E[cnt].w=w; E[cnt].f=f; } inline void addedge(int x,int y,int f,int w,int t){ add(x,y,f,w); tag[cnt]=t; add(y,x,0,-w); tag[cnt]=t; } inline void link(int x,int y,int f,int w){ if(w>0){ ans+=f*w; addedge(y,x,f,-w,1); addedge(SS,y,f,0,0); addedge(x,TT,f,0,0); } else addedge(x,y,f,w,0); } int vis[35][35]; int dis ,vst ,frm ; queue<int> Q; inline bool spfa(){ for(int i=1;i<=TT;i++) dis[i]=-inf,vst[i]=0; vst[SS]=1; dis[SS]=0; Q.push(SS); while(!Q.empty()){ int x=Q.front(); vst[x]=0; Q.pop(); for(int i=G[x];i;i=E[i].nx) if(E[i].f && dis[E[i].t]<dis[x]+E[i].w){ dis[E[i].t]=dis[x]+E[i].w; frm[E[i].t]=i; if(!vst[E[i].t]) vst[E[i].t]=1,Q.push(E[i].t); } } if(dis[TT]==-inf) return false; int mf=inf; for(int i=TT;i!=SS;i=E[frm[i]^1].t) mf=min(mf,E[frm[i]].f); ans+=dis[TT]*mf; for(int i=TT;i!=SS;i=E[frm[i]^1].t) E[frm[i]].f-=mf,E[frm[i]^1].f+=mf; return true; } int main(){ scanf("%d",&t); int Case=0; while(t--){ memset(G,0,sizeof(G)); cnt=1; ans=0; scanf("%d%d",&n,&m); S=2*y(n,m)+1; T=2*y(n,m)+2; SS=T+1; TT=SS+1; for(int i=1;i<=n;i++) for(int j=1;j<m;j++){ int c; scanf("%d",&c); if(~(i+j)&1) link(x(i,j),x(i,j+1),1,c); else link(x(i,j+1),x(i,j),1,c); } for(int i=1;i<n;i++) for(int j=1;j<=m;j++){ int c; scanf("%d",&c); if((i+j)&1) link(y(i,j),y(i+1,j),1,c); else link(y(i+1,j),y(i,j),1,c); } for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) vis[i][j]=0; int e; scanf("%d",&e); while(e--){ int x,y; scanf("%d%d",&x,&y); vis[x][y]=1; } int ct=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if((i+j)&1){ if(!vis[i][j]) link(x(i,j),y(i,j),1,0); else ct++,link(S,y(i,j),1,0),link(x(i,j),T,1,0); } else{ if(!vis[i][j]) link(y(i,j),x(i,j),1,0); else ct++,link(S,x(i,j),1,0),link(y(i,j),T,1,0); } } while(spfa()); memset(G,0,sizeof(G)); int lst=cnt; for(int i=2;i<=lst;i++){ if(E[i^1].t==S) int sss=0; if(E[i].t==SS || E[i].t==TT || E[i^1].t==SS || E[i^1].t==TT) continue; if(tag[i]) add(E[i].t,E[i^1].t,E[i^1].f,-E[i].w); else add(E[i^1].t,E[i].t,E[i].f,E[i].w); } SS=S; TT=T; while(spfa()) ct--; if(ct) printf("Case #%d: Impossible\n",++Case); else printf("Case #%d: %d\n",++Case,ans); } return 0; }
相关文章推荐
- The 2016 ACM-ICPC Asia China-Final Contest H题 数学 + 思维
- 2016 ACM-ICPC China Finals #F Mr. Panda and Fantastic Beasts
- 4046 Panda(The 36th ACM/ICPC Asia Regional Beijing Site —— Online Contest)
- 1006 ACM again- Ancient China Mathematics again //The ACM/ICPC Asia Harbin Online First Round Contest 2010 Warmup-2
- HDU5900 QSC and Master(区间DP)2016 ACM/ICPC Asia Regional Shenyang Online
- HDU 5900 QSC and Master(2016 ACM/ICPC Asia Regional Shenyang Online)
- The 2016 ACM-ICPC Asia China-Final C (15/600)
- hdu 5900 QSC and Master 区间dp(2016 ACM/ICPC Asia Regional Shenyang Online)
- The 2013 ACM-ICPC Asia Changsha Regional Contest J Josephina and RPG
- 2016 ACM/ICPC Asia Regional Shenyang Online HDU 5900 QSC and Master(区间dp水题)
- The 36th ACM/ICPC Asia Regional Beijing Site Online Contest - G Panda
- The 36th ACM/ICPC Asia Regional Beijing Site Online Contest - G Panda
- 2016 China Final F Mr. Panda and Fantastic Beasts
- 【HDU5900 2016 ACM ICPC Asia Regional Shenyang Online I】【区间DP】QSC and Master 相邻互质取数最大取值.cpp
- [acm/icpc2016ChinaFinal][CodeforcesGym101194] Mr.Panda and TubeMaster
- 【树状数组】The 36th ACM/ICPC Asia Regional Beijing Site Online Contest - G Panda
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem I. Plugs and Sockets 费用流
- Your ways (动态规划)ACM-ICPC Asia Phuket Regional Programing Contest 2009
- HDU 5045 Contest 期望+状压dp 2014 ACM/ICPC Asia Regional Shanghai Online
- hdu4430 Yukari's Birthday 2012 ACM_ICPC Asia ChangChun Regional Contest problem K