正解:网络流

解题报告:

传送门$QwQ$

昂考虑把题目的约束条件详细化?就说每个格点能向四连通连边,问能否做到每个格点度数等于2?

$umm$就先黑白染色建两排点呗,然后就$S$向左侧连流量为2的边右侧向$T$连流量为2的边,然后四连通之间连流量为1的边,跑个最大流看跑满没有,然后就做完了?$QwQ$

解释下趴还是,,,毕竟我之前没解释重新看一遍我题解都没想通$QAQ$

首先找出题目的所有约束条件$QwQ$

1)每个房间进出各一次

2)每扇门最多经过一次

3)环长大于2

昂条件一等价于每个点度数等于2嘛,然后其实有了条件二就一定能满足条件三鸭,所以现在就变成,每个点度数等于2,且相邻点之间最多经过一次.

所以就$ST$分别向点连流量为2的边相邻之间连流量为1的边就欧克了$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=1e9;
char str[M];
bool zt[M][M];
struct ed{int to,nxt,wei;}edge[N<<];
int n,m,dep[N],head[N],cur[N],S,T,ed_cnt=-,mvx[]={,,,-},mvy[]={,-,,},cnt; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int nam(ri x,ri y){return (x-)*m+y;}
il void print(ri d)
{
if(!d)return void(printf("S"));if(d>n*m)return void(printf("T"));
ri y=d%m,x=d/m+;if(!y)y=m,--x;printf("(%d , %d)",x,y);
}
il void ad(ri x,ri y,ri z)
{//printf("%d -> %d : %d\n",y,x,z);
//print(y);printf(" -> ");print(x);printf(" : %d\n",z);
edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();
e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));if(t(i)==T)return ;}
}
return ;
}
il int dfs(ri nw,ri flow)
{
if(nw==T || !flow)return flow;ri ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+)
{ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
return ret;
}
il int dinic(){ri ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;} int main()
{
//freopen("3877.in","r",stdin);freopen("3877.out","w",stdout);
ri tmp=read();
while(tmp--)
{
ed_cnt=-;memset(head,-,sizeof(head));n=read();m=read();cnt=;
rp(i,,n){scanf("%s",str);rp(j,,m)cnt+=(zt[i][j]=str[j-]=='.');}S=;T=n*m+;
rp(i,,n)rp(j,,m)
{
if((i+j)& && zt[i][j])
rp(k,,)
{
ri tx=i+mvx[k],ty=j+mvy[k];
if(!tx || !ty || tx>n || ty>m)continue;
if(zt[tx][ty])ad(nam(tx,ty),nam(i,j),);
}
}
rp(i,,n)rp(j,,m)if(zt[i][j]){if((i+j)&)ad(nam(i,j),S,);else ad(T,nam(i,j),);}
if(cnt&){printf("NO\n");continue;}
if(dinic()==cnt)printf("YES\n");else printf("NO\n");
}
return ;
}

洛谷$P3877\ [TJOI2010]$打扫房间 网络流的更多相关文章

  1. 洛谷P3877 [TJOI2010]打扫房间 解题报告

    首先整理一下条件: 1.恰好进出每个需打扫的房间各一次 2.进出每个房间不能通过同一个门 (其实前两个条件是一回事) 3.要求每条路线都是一个闭合的环线 4.每条路线经过的房间数大于2 让你在一个n* ...

  2. P3877 [TJOI2010]打扫房间

    xswl以为是个插头dp,然后发现就是个sb题 相当于就是个匹配.每个格子度数为2,所以可以匹配2个相邻的点.匹配显然的用网络流.最后check有没有不匹配的点即可. #include<bits ...

  3. Luogu3877 TJOI2010 打扫房间 二分图、网络流

    传送门 真是菜死了模板题都不会-- 首先\(30 \times 30\)并不能插头DP,但是范围仍然很小所以考虑网络流. 注意每个点都要包含在一个回路中,那么每一个点的度数都必须为\(2\),也就是说 ...

  4. [TJOI2010]打扫房间

    题目描述 学校新建了一批宿舍,值日生小A要把所有的空房间都打扫一遍.这些宿舍的布局很奇怪,整个建筑物里所有的房间组成一个N * M的矩阵,每个房间的东南西北四面墙上都有一个门通向隔壁房间.另外有些房间 ...

  5. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  6. 洛谷$P2604\ [ZJOI2010]$网络扩容 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂第一问跑个最大流就成不说$QwQ$ 然后第二问,首先原来剩下的边就成了费用为0的边?然后原来的所有边连接的两点都给加上流量为$inf$费用为$w$的边,保 ...

  7. 洛谷P1402 酒店之王(网络流)

    ### 洛谷P1402 题目链接 ### 题目大意:有 n 个人, p 间房间,q 种食物.每个人喜欢一些房间,一些食物,但每间房间.每种食物只能分配给一个人.问最大可以让多少个人满足(当且仅当分配到 ...

  8. 洛谷P2770 双路DP // 网络流

    https://www.luogu.org/problemnew/show/P2770 第一眼看过去,觉得这不是一个经典的双路DP模型吗,将一条过去一条回来互不相交的路径看作是起点出发了两条路径一起走 ...

  9. 3150luogu洛谷

    若说代码 那真的是很水 但是 思想却有点意思 这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢. 这道题的做法就是: 如果m为偶数, 那么先手赢( ...

随机推荐

  1. @codeforces - 1214G@ Feeling Good

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n*m 的 01 矩阵 A,一开始所有格子都为 0. ...

  2. 1176. Two Ends

    题目链接地址:http://soj.me/1176 题目大意:两头取数.第一个人随机取,第二个人用贪婪算法(每次都取大的),求两人取数在第一个人赢的情况下的最大分差.使用贪婪算法时,如果左右两边相等, ...

  3. ocilib linux编译安装

    1.首先下载ocilib到自己目录 github:https://github.com/vrogier/ocilib 2.在下载instantclient 11.2.2的文件: instantclie ...

  4. Python多版本pip安装库的问题

    引 机器上总是会有Python2.7的版本和Python3.x的版本,今天接触到一台服务器上面有Python2.7和Python3.4,想在Python3.4下安装一个TensorFlow,但不管怎么 ...

  5. @atcoder - ARC066F@ Contest with Drinks Hard

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定序列 T1, T2, ... TN,你可以从中选择一些 Ti ...

  6. HZOJ 大佬(kat)

    及其水水水的假期望(然而我已经被期望吓怕了……). 数据范围及其沙雕导致丢掉5分…… 因为其实每天的期望是一样的,考虑分开. f[i][j]表示做k道题,难度最大为j的概率. 则f[i][j]=(f[ ...

  7. UIImageView xib里面拉伸图片技巧

    拉伸图片的时候代码里和xib里面的图片名字去掉@2x,但是原始图片文件得要xxx@2x.png The X and Y values seem to be the positions for the ...

  8. uva 11754 Code Feat (中国剩余定理)

    UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...

  9. H3C 分组交换连接模型

  10. 洛谷 1131 [ZJOI2007] 时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...