2017.9.23 循环格 思考记录

来源:互联网 发布:知乎 俄罗斯 计算机 编辑:程序博客网 时间:2024/05/21 17:14

终于不是失败总结了,

这个题其实还是很好分析的,由于每个格子只有一个方向,所以可以考虑每个格子选取唯一的哪个方向

(其实很多网络流的题都隐含1的条件,找到1的条件限制网络流就好想了)

然后就是自带的方向费用是0,修改的方向是1,限制每个点的流入流出,跑完mcmf就是答案了、


码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define N 15*15*6#include<queue>queue<int>q;int tot=-1,hou[N*4],xia[N],zhong[N*4],v[N*4],c[N*4],s,t,n,m,d[N],qj[N],ans;bool vis[N];char str;void jian(int a,int b,int d,int ll){++tot,hou[tot]=xia[a],xia[a]=tot,zhong[tot]=b,c[tot]=d,v[tot]=ll;}void jia(int a,int b,int c){jian(a,b,c,1);jian(b,a,-c,0);}bool spfa(){int i,j;q.push(s);for(i=1;i<=3*n*m;i++){d[i]=1000000009;}d[s]=0;while(!q.empty()){int st=q.front();vis[st]=0;q.pop();for(i=xia[st];i!=-1;i=hou[i]){int nd=zhong[i];if(v[i]>0&&d[nd]>d[st]+c[i]){d[nd]=d[st]+c[i];qj[nd]=i^1;if(vis[nd]==0){vis[nd]=1;q.push(nd);}}}}if(d[t]>1000000007)return 0; //cout<<d[t]<<endl;for(i=qj[t];;i=qj[zhong[i]]){ans+=c[i^1];v[i]++;v[i^1]--;if(zhong[i]==s)break;}return 1;}void mcmf(){while(spfa());}int main(){int i,j;memset(xia,-1,sizeof(xia));scanf("%d%d",&n,&m);s=2*n*m+1;t=2*n*m+2;for(i=1;i<=n;i++)for(j=1;j<=m;j++){scanf("%c",&str);while(str!='R'&&str!='L'&&str!='U'&&str!='D')scanf("%c",&str);int lin;jia(s,(i-1)*m+j,0);jia(n*m+(i-1)*m+j,t,0);    if(str=='R'){lin=j+1;if(lin>m)lin-=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,0);lin=j-1;if(lin<=0)lin=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=i-1;if(lin==0)lin=n;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);lin=i+1;if(lin>n)lin=1;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);}if(str=='L'){lin=j+1;if(lin>m)lin-=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=j-1;if(lin<=0)lin=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,0);lin=i-1;if(lin==0)lin=n;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);lin=i+1;if(lin>n)lin=1;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);}if(str=='U'){lin=j+1;if(lin>m)lin-=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=j-1;if(lin<=0)lin=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=i-1;if(lin==0)lin=n;jia((i-1)*m+j,n*m+(lin-1)*m+j,0);lin=i+1;if(lin>n)lin=1;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);}if(str=='D'){lin=j+1;if(lin>m)lin-=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=j-1;if(lin<=0)lin=m;jia((i-1)*m+j,n*m+(i-1)*m+lin,1);lin=i-1;if(lin==0)lin=n;jia((i-1)*m+j,n*m+(lin-1)*m+j,1);lin=i+1;if(lin>n)lin=1;jia((i-1)*m+j,n*m+(lin-1)*m+j,0);}}mcmf();printf("%d",ans); }


原创粉丝点击