3171: [Tjoi2013]循环格
来源:互联网 发布:家里有网络怎么看电视 编辑:程序博客网 时间:2024/05/22 23:47
题目链接
题目大意:N*M的矩阵,每个格子有一个LRUD标记表示走到这个格子后下一个格子往哪个方向走。走出边界后自动到另一端。问至少修改几个格子使得在任意一个格子上开始都可以最后回到自身
题解:结论:每个点只存在于一个环中所以入度和出度都为1
每个格子向相邻四个格子连边,容量为1,与原有方向相同费用为0,否则费用为1
跑最小费用最大流
我的收获:结论出奇迹
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>using namespace std;const int M=17;const int MM=M*M*2+5;#define INF 0x3f3f3f3fconst int dx[]={-1,1,0,0};const int dy[]={0,0,1,-1};const char direct[] = {'U','D','R','L'};int n,m,t,cnt,st,ed,ans;int head[MM],d[MM],pre[MM];int in[M][M],out[M][M];char mp[M][M];bool vis[MM];queue<int> q;struct edge{int fro,to,c,val,nex;}e[1000005];void add(int u,int v,int c,int val){e[t]=(edge){u,v,c,val,head[u]};head[u]=t++;}void insert(int i,int j,int w,int z){add(i,j,w,z),add(j,i,0,-z);}bool spfa(){ for(int i=0;i<=ed;i++) vis[i]=0,d[i]=INF; d[st]=0;q.push(st); while(!q.empty()) { int u=q.front();q.pop();vis[u]=false; for(int i=head[u];i!=-1;i=e[i].nex){ int v=e[i].to; if(e[i].c&&d[v]>d[u]+e[i].val){ d[v]=d[u]+e[i].val; pre[v]=i; if(!vis[v]){ vis[v]=true; q.push(v); } } } } return d[ed]!=INF;}void flow(){ int mx=INF; for(int u=ed;u!=st;u=e[pre[u]].fro) mx=min(mx,e[pre[u]].c); for(int u=ed;u!=st;u=e[pre[u]].fro){ e[pre[u]].c-=mx;e[pre[u]^1].c+=mx; ans+=mx*e[pre[u]].val; }}void build(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) insert(st,in[i][j],1,0),insert(out[i][j],ed,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<4;k++) { int fx=i+dx[k],fy=j+dy[k]; if(fx<1) fx=n;if(fx>n) fx=1; if(fy<1) fy=m;if(fy>m) fy=1; insert(in[i][j],out[fx][fy],1,mp[i][j]!=direct[k]); }}void work(){ while(spfa()) flow(); cout<<ans<<endl;}void init(){ cin>>n>>m; t=0;memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) in[i][j]=++cnt,out[i][j]=n*m+cnt; for(int i=1;i<=n;i++) scanf("%s",mp[i]+1); st=0,ed=cnt+n*m+1;build();}int main(){ init(); work(); return 0;}
阅读全文
0 0
- 3171: [Tjoi2013]循环格
- 3171: [Tjoi2013]循环格
- 3171: [Tjoi2013]循环格
- BZOJ 3171 [Tjoi2013]循环格
- [费用流]BZOJ:3171: [Tjoi2013]循环格
- BZOJ-3171-循环格-TJOI2013-费用流
- 3171: [Tjoi2013]循环格 费用流
- bzoj 3171: [Tjoi2013]循环格 费用流
- [Tjoi2013]循环格
- 【TJOI2013】循环格
- bzoj3171【tjoi2013】循环格
- 【bzoj3171】[Tjoi2013]循环格
- BZOJ3171 Tjoi2013 循环格
- 【bzoj3171】[Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- bzoj3171 [Tjoi2013]循环格
- [树形dp][trie]cf856B Similar Words
- Python函数式编程之lambda
- 知识点1
- 下载CentOS
- 前后端分离
- 3171: [Tjoi2013]循环格
- 写程序学ML:K近邻(KNN)算法原理及实现(一)
- secureCRT连接linux
- R实战:【常用函数】transform对列数据加工生成新列
- Parse Fatal Error at line 4 column 43 已经为元素 web-app 指定属性 xmlns。
- VMware提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。
- 4196: [Noi2015]软件包管理器
- 2-4 shell 排序
- NOIP 2017 全假模拟冲刺[By Hkd]