BZOJ3171: [Tjoi2013]循环格
来源:互联网 发布:php nusoap wsdl 编辑:程序博客网 时间:2024/05/03 08:47
易知题目要求最终达到的状态是原图有若干个环,那么所有点的出度和入度都为1,费用流…
建图的话,拆点,源向左侧点连容量为1,费用0的边,代表出度,右侧点向汇连容量为1,费用0的边,代表入度,然后每个点的向四个方向的点连容量1,如果不是本来的方向费用1,否则费用0
code:
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;void up(int &x,int y){if(y>x)x=y;}void down(int &x,int y){if(y<x)x=y;}const int maxn = 1100;const int maxm = 110000;const char di[4]={'U','R','D','L'};struct edge{ int y,c,d,nex; edge(){} edge(int _y,int _c,int _d,int _nex){y=_y;c=_c;d=_d;nex=_nex;}}a[maxm]; int len,fir[maxn];int dir[maxn];int n,m,st,ed;void ins(int x,int y,int c,int d){ a[++len]=edge(y,c,d,fir[x]); fir[x]=len; a[++len]=edge(x,0,-d,fir[y]); fir[y]=len;}struct node{ int x,i; node(){} node(int _x,int _i){x=_x;i=_i;}};bool operator <(node x,node y){return x.x>y.x;}queue<node>Q;int pos[maxn],pre[maxn],d[maxn];bool bfs(){ for(int i=1;i<=ed;i++) d[i]=INT_MAX; d[st]=0; Q.push(node(0,st)); while(!Q.empty()) { node x=Q.front(); Q.pop(); if(x.x>d[x.i]) continue; for(int k=fir[x.i];k;k=a[k].nex) { int y=a[k].y; if(a[k].c&&d[y]>d[x.i]+a[k].d) { d[y]=d[x.i]+a[k].d; pos[y]=x.i; pre[y]=k; Q.push(node(d[y],y)); } } } return d[ed]!=INT_MAX;}int g(){ int k=INT_MAX; for(int x=ed;x!=st;x=pos[x]) down(k,a[pre[x]].c); for(int x=ed;x!=st;x=pos[x]) { a[pre[x]].c-=k; a[pre[x]^1].c+=k; } return k*d[ed];}int main(){ char s[1000]; memset(fir,0,sizeof fir); len=1; scanf("%d%d",&n,&m);int nm=n*m; gets(s); int id=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { id++; char str; scanf("%c",&str); for(int k=0;k<4;k++) if(str==di[k]) dir[id]=k; } gets(s); } st=id*2+1; ed=st+1; for(int i=1;i<=id;i++) ins(st,i,1,0),ins(i+id,ed,1,0); id=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { id++; int idy; //1 idy=id-m; if(i==1) idy+=nm; ins(id,idy+nm,1,dir[id]!=0); //2 idy=id+1; if(j==m) idy-=m; ins(id,idy+nm,1,dir[id]!=1); //3 idy=id+m; if(i==n) idy-=nm; ins(id,idy+nm,1,dir[id]!=2); //4 idy=id-1; if(j==1) idy+=m; ins(id,idy+nm,1,dir[id]!=3); } } int ret=0; while(bfs()) ret+=g(); printf("%d\n",ret); return 0;}
0 0
- bzoj3171【tjoi2013】循环格
- 【bzoj3171】[Tjoi2013]循环格
- BZOJ3171 Tjoi2013 循环格
- 【bzoj3171】[Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- BZOJ3171: [Tjoi2013]循环格
- bzoj3171 [Tjoi2013]循环格
- 【bzoj3171】[Tjoi2013]循环格 (费用流)
- 【bzoj3171】【TJOI2013】【循环格】【费用流】
- bzoj3171 [Tjoi2013]循环格(费用流)
- [BZOJ3171][TJOI2013][最小费用最大流]循环格
- [Tjoi2013]循环格
- 【TJOI2013】循环格
- 3171: [Tjoi2013]循环格
- 3171: [Tjoi2013]循环格
- 3171: [Tjoi2013]循环格
- bzoj3171 循环格 最小费用流
- C#中值类型与引用类型对比
- 关于数据库的几个名词
- Laravel 5.4 migrate时报错: Specified key was too long error
- 51nod 1378 夹克老爷的愤怒
- 第十章 内部类
- BZOJ3171: [Tjoi2013]循环格
- SpringBoot 入门教程:集成mybatis,redis
- js插件之删除确认插件
- c++ 关键字 decltype
- Android 音乐播放器
- iOS零碎笔记
- python进阶
- Qt之QVariant和QByteArray详解(一)
- 使用Navicat for mysql添加外键约束