传送门

考虑构建网络流模型

把一个流量看成一只奶牛的攻击过程,那么答案就是最大流

因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步

第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流量为 $1$ 的边,表示只有一只 $J$

下一层,表示奶牛走一步后的状态,每只 $J$ 向下一层走一步可以到达的点连流量为 $1$ 的边,当然奶牛可以不走,所以也要向下一层原来的位置连流量为 $1$ 的边

再下一层就可以考虑奶牛攻击了,但是因为每个位置只能站一只奶牛,所以这一层还要再拆成两层,对于点之间连流量为 $1$ 的边,表示一个位置只能站一只奶牛,然后再把所有的 $T$牛 连一条流量为 $1$ 的边到 $T$(汇点),因为一只 $T$牛 只能被打翻一次

最后答案就是最大流

总结一下就是图分成四层,每一步慢慢考虑

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
inline int read()
{int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=1e5+7,M=4e6+7,INF=1e9+7;
int fir[N],from[M],to[M],val[M],cntt=1;
inline void add(int a,int b,int c)
{from[++cntt]=fir[a]; fir[a]=cntt;to[cntt]=b; val[cntt]=c;from[++cntt]=fir[b]; fir[b]=cntt;to[cntt]=a; val[cntt]=0;
}
int dep[N],Fir[N],S,T;
queue <int> q;
bool BFS()
{for(int i=S;i<=T;i++) Fir[i]=fir[i],dep[i]=0;q.push(S); dep[S]=1; int x;while(!q.empty()){x=q.front(); q.pop();for(int i=fir[x];i;i=from[i]){int &v=to[i]; if(dep[v]||!val[i]) continue;dep[v]=dep[x]+1; q.push(v);}}return dep[T]>0;
}
int DFS(int x,int mxf)
{if(x==T||!mxf) return mxf;int fl=0,res;for(int &i=Fir[x];i;i=from[i]){int &v=to[i]; if(dep[v]!=dep[x]+1||!val[i]) continue;if( res=DFS(v,min(mxf,val[i])) ){mxf-=res; fl+=res;val[i]-=res; val[i^1]+=res;if(!mxf) break;}}return fl;
}
inline int Dinic() { int res=0; while(BFS()) res+=DFS(S,INF); return res; }int n,m;
char s[N];
int main()
{n=read(),m=read();scanf("%s",s+1);S=0,T=n*4+1; int a,b;for(int i=1;i<=n;i++){if(s[i]=='J') add(S,i,1),add(i,n+i,1);if(s[i]=='T') add(n*3+i,T,1);else add(n+i,n*2+i,1);}for(int i=1;i<=m;i++){a=read(),b=read();if(s[a]!='T'&&s[b]!='T') add(a,n+b,1),add(b,n+a,1);if(s[a]!='T'&&s[b]=='T') add(n*2+a,n*3+b,1);if(s[b]!='T'&&s[a]=='T') add(n*2+b,n*3+a,1);}printf("%d",Dinic());return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/10815479.html

BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争相关推荐

  1. [BZOJ 1778][Usaco2010 Hol]Dotp 驱逐猪猡

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 690  Solved: 269 [Sub ...

  2. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP

    [Usaco2010 Mar]gather 奶牛大集会 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1 ...

  3. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  4. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...

  5. COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛

    http://www.lydsy.com/JudgeOnline/problem.php?id=1776||http://cogs.pro/cogs/problem/problem.php?pid=8 ...

  6. [Usaco2010 Hol]cowpol 奶牛政坛

    题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...

  7. [Usaco2010 Hol]cowpol 奶牛政坛(入门oj Problem 5274)

    第三次发题解哈.有什么表述错误的请见谅(可以提出). 题目源地址:https://www.lydsy.com/JudgeOnline/problem.php?id=1776 文章目录 题目描述 输入 ...

  8. BZOJ 1778 [Usaco2010 Hol] Dotp 驱逐猪猡

    Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44, ...

  9. bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡

    http://www.elijahqi.win/archives/3299 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= ...

最新文章

  1. c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc
  2. linux 可执行文件_linux中ELF二进制程序解析
  3. linux打开应用程序的命令,Windows环境下如何通过命令打开程序!
  4. python中用*打印一个上三角形和下三角形组成的三角形
  5. java 打包zip下载_java web 将文件打包成 .zip后 肿么自动弹出下载框提示并下载?
  6. t-sne原理解释_T-SNE解释-数学与直觉
  7. 项目管理十大知识领域,为何不含
  8. excel字体颜色对照表 取值0-63
  9. 实时录制视频,实时去除人_录制实时演示,第2部分:软件设置
  10. 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...
  11. 说说WeakReference弱引用
  12. 王爽《汇编语言》第2版-----2、寄存器
  13. 揭秘成为最牛程序员的五大要诀
  14. Python定时爬取微博热搜+pyecharts动态图展示
  15. android 11.0 12.0Launcher3去掉默认的google搜索栏
  16. 音频/视频标签的使用
  17. (附源码)spring boot基于微信小程序的口腔诊所预约系统 毕业设计 201738
  18. Python将string转换到float的实例方法
  19. oracle 客户端修复,传授win7系统配置Oracle客户端连接失败的恢复方法
  20. Java项目:在线车队货车管理系统(java+SSM+JSP+bootstrap+Mysql)

热门文章

  1. c通过位运算求绝对值_初中数学归类总结(四)有理数的乘除乘方及混合运算...
  2. leetcode448-Find All Numbers Disappeared in an Array
  3. 分布式对象存储 读书笔记(一) 开始
  4. 元素位置及宽度的计算总节
  5. LintCode Python 简单级题目 491.回文数
  6. 炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!
  7. [书目20081126]转型:用对策略,做对事
  8. java代码隐藏面消除算法,java常面的几种排序算法
  9. dict过滤 python_小猿圈解析Python开发的技巧都有哪些?
  10. c语言n次方怎么输入_C语言基本数据类型的思维导图