【bzoj3171】[Tjoi2013]循环格
2016-01-02 20:17
330 查看
满足条件的情况必然是每个点的出度=入度=1
所以用流量守恒来限制相等 用最小费用来决策最优改动
到此为止几乎就是拆一下点的裸费用流 然而到此还真是不容易呢。。
所以用流量守恒来限制相等 用最小费用来决策最优改动
到此为止几乎就是拆一下点的裸费用流 然而到此还真是不容易呢。。
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<cmath> using namespace std; const int N=15*15*4; const int M=N*50; const int inf=0x7fffffff; int head ,next[M],key[M],w[M],cost[M],tot; int dist ,inq ,fr ,mn ;queue<int>q; int S,T; char map ; int n,m; const int dx[]={0,0,-1,1}; const int dy[]={-1,1,0,0}; void add(int x,int y,int z,int c) { tot++;next[tot]=head[x];head[x]=tot;key[tot]=y;w[tot]=z;cost[tot]=c; tot++;next[tot]=head[y];head[y]=tot;key[tot]=x;w[tot]=0;cost[tot]=-c; } void bili() { tot=-1; memset(head,-1,sizeof(head)); } int spfa() { for(int i=S;i<=T;i++)dist[i]=inf,mn[i]=inf; dist[S]=0; q.push(S); while(!q.empty()) { int x=q.front(); q.pop(); inq[x]=0; for(int i=head[x];i!=-1;i=next[i]) { int y=key[i]; if(w[i]&&dist[y]>dist[x]+cost[i]) { dist[y]=dist[x]+cost[i]; fr[y]=i; mn[y]=min(mn[x],w[i]); if(inq[y]==0)q.push(y),inq[y]=1; } } } if(dist[T]==inf)return 0; return 1; } long long zeng() { for(int i=T;i!=S;i=key[fr[i]^1]) w[fr[i]]-=mn[T],w[fr[i]^1]+=mn[T]; return (long long)dist[T]*mn[T]; } int get(int x,int y) { if(y>m)y=1; if(y<1)y=m; if(x>n)x=1; if(x<1)x=n; return (x-1)*m+y; } int main() { bili(); cin>>n>>m; S=0,T=n*m*2+1; for(int i=1;i<=n;i++)scanf("%s",map[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int id=get(i,j); add(S,id,1,0); int nx,ny; if(map[i][j]=='R')nx=i,ny=j+1; if(map[i][j]=='L')nx=i,ny=j-1; if(map[i][j]=='U')nx=i-1,ny=j; if(map[i][j]=='D')nx=i+1,ny=j; for(int k=0;k<4;k++) { int ni=dx[k]+i; int nj=dy[k]+j; if(ni==nx&&nj==ny)add(id,get(ni,nj)+n*m,1,0); else add(id,get(ni,nj)+n*m,1,1); } add(id+n*m,T,1,0); } int ans=0; while(spfa())ans+=zeng(); printf("%d\n",ans); }
相关文章推荐
- 【转】磁场传感器和方位(上)
- HDU 2717 Catch That Cow(BFS)
- ubuntu 14.0.4 下安装 cuda 7.5
- C#操作Dataset数据集与SQLite数据库
- 2016~
- 不依附于任何网站建立自己的博客(基于hexo + github)
- 聊聊 virtualenv 和 virtualenvwrapper 实践
- 【设计模式】模板方法模式
- xcode自动生成代码片段
- 实战开发-Ashurol天气预报APP(二)
- 自定义View-----setVisibility
- [Linux]Centos git报错fatal: HTTP request failed
- PCL-泊松重建
- 利用Theano理解深度学习——Multilayer Perceptron
- MATLAB中多行注释的三种方法
- Map-Reduce程序设计
- WebGoat之HTTP Spliting(拆分)过程及总结分析 - 2016.01.02
- C语言_扫雷代码
- LeetCode 88:Merge Sorted Array
- 设计模式(11)-组合模式