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); }
阅读全文
0 0
- 2017.9.23 循环格 思考记录
- 2017.9.4 Nim 思考记录
- 2017.9.6 礼物 思考记录
- 2017.9.6 外星人 思考记录
- 2017.9.7 骑士 思考记录
- 2017.9.9 股票交易 思考记录
- 2017.9.10 ricehub 思考记录
- 2017.9.11 海拔 思考记录
- 2017.9.14 dispatching 思考记录
- 2017.9.14 仪仗队 思考记录
- 2017.9.17 function 思考记录
- 2017.9.17 kamp 思考记录
- 2017.9.19 Gcd 思考记录
- 2017.9.20 mode 思考记录
- 2017.9.27 书架 思考记录
- 2017.9.28 降雨量 思考记录
- 2017.9.29 谁能赢呢? 思考记录
- 2017.6.23 染色 思考记录
- Jedis连接Redis异常的问题
- 形参和实参的区别
- idea激活服务器地址
- mySql中的删除(delete,truncate,drop)的区别
- Dijkstra模板
- 2017.9.23 循环格 思考记录
- Linux虚拟机怎么用root身份登录
- matlab-figure图形-相关设置(xlabel+ylabel+特殊点标记 +填充)
- MyEclipse快捷键
- 他们为什么选择前端工程化,而我又是基于什么考虑的
- LinuxStudyNote(18)-Linux常用命令(2)-文件处理命令(13)-文件显示(4)-less分页显示文件内容往前翻页以及内容查找
- 扰心的总结
- 杨辉三角问题 Java和Python实现
- 【笔记】java8中List分组方法的使用