bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)
1779: [Usaco2010 Hol]Cowwar 奶牛战争
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 302 Solved: 131
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
TEJTJ
1 2
2 3
3 4
4 5
Sample Output
HINT
输出细节:
其他可行的输出为:
2
MOVE 3 2
ATTACK 5 4
ATTACK 2 1
或者
2
ATTACK 5 4
MOVE 3 2
ATTACK 2 1
其它的输出祇是改变一下命令的顺序。但是并不是所有的数据都是这样的。
Source
一只$T$牛挂一次,一只$J$牛搞一头$T$,这可以用网络流瞎搞(设$s,t$为源汇点)
看这个$E$,显然只能走一次,于是拆成$E_1,E_2$,$link(E_1,E_2,1)$
牛可能从$E$攻击$T$,$link(E_2,T,1)$
看这个$T$,显然只能挂一次,$link(T,t,1)$
看这个$J$,一大堆操作可以搞,我们也把它拆成$J_1,J_2$
但是!两个点似乎不顶用,比如说本人花了1.5h造了个数据卡了自己的两点图:
8 7
JJJEETTT
1 2
3 2
2 4
2 7
2 5
4 6
5 8
大概长这样:
$J_1,J_2$不够用,那么把$J$拆成$J_1,J_2,J_3$
$link(s,J_1,1),link(J_1,J_2,1)$
$J_1$是原来的点,$J_2$表示从其他$J$转移过来的点
$J_3$连$T$,显然只能一个$J$连$T$,$link(J_2,J_3,1)$
设这个$J$点的编号为$i$,枚举$j$
$if(q[j]=='E') link(i,j,1)$
$if(q[j]=='J') link(i,j_2,1)$
$if(q[j]=='T') link(i_3,j,1);$
蓝后就可以快乐地跑最大流辣
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 5005
#define M 100005
const int inf=2e9;
int n,m,S,T,d[N],cur[N]; char q[N];
queue <int> h; bool vis[N],e[N][N];
int cnt=,hd[N],nxt[M],ed[N],poi[M],val[M];
inline void adde(int x,int y,int v){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
}
inline void link(int x,int y,int v){adde(x,y,v),adde(y,x,);}
bool bfs(){
for(int i=;i<=T;++i) vis[i]=,cur[i]=hd[i];
h.push(S); vis[S]=;
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(!vis[to]&&val[i]>)
vis[to]=,d[to]=d[x]+,h.push(to);
}
}return vis[T];
}
int dfs(int x,int a){
if(x==T||a==) return a;
int F=,f;
for(int &i=cur[x];i;i=nxt[i]){
int to=poi[i];
if(d[to]==d[x]+&&(f=dfs(to,min(a,val[i])))>)
a-=f,F+=f,val[i]-=f,val[i^]+=f;
if(!a) break;
}return F;
}
int dinic(){int re=; while(bfs())re+=dfs(S,inf); return re;}
int main(){
scanf("%d%d",&n,&m); scanf("%s",q+);
S=n*+; T=S+;//开3*n的点
for(int i=,u,v;i<=m;++i) scanf("%d%d",&u,&v),e[u][v]=e[v][u]=;
for(int i=;i<=n;++i){
if(q[i]=='T') link(i,T,);
if(q[i]=='E'){
link(i,i+n,);
for(int j=;j<=n;++j)
if(e[i][j]&&q[j]=='T') link(i+n,j,);
}
if(q[i]=='J'){
link(S,i,);
link(i,i+n,);
link(i+n,i+n+n,);
for(int j=;j<=n;++j){
if(!e[i][j]) continue;
if(q[j]=='E') link(i,j,);
if(q[j]=='J') link(i,j+n,);
if(q[j]=='T') link(i+n+n,j,);
}
}
}printf("%d",dinic());
return ;
}
bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)的更多相关文章
- BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争
传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...
- 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径
[BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...
- [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca
[Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...
- bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛
Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...
- [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛
Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...
- bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛——树的直径
农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可以抵达其他所 ...
- 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 ...
- [Usaco2010 Hol]cowpol 奶牛政坛
题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...
- 【BZOJ】1776: [Usaco2010 Hol]cowpol 奶牛政坛
[题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树 ...
随机推荐
- xxPay搭建步骤
随着电子商务的发展,移动支付也走进我们的日常生活,就像很多基础业务,如物流.云平台一样,我们现在做什么都离不开她.正因为如此,支付是当下最活跃最前沿的话题,很多流行的技术最早用来实现支付,很多新的业务 ...
- 六、MyBatis-缓存机制
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率.MyBatis系统中默认定义了两级缓存, 一级 缓存和 二级缓存.– 1.默认情况下,只有一级缓 ...
- bzoj3123 [Sdoi2013]森林 树上主席树+启发式合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3123 题解 如果是静态的查询操作,那么就是直接树上主席树的板子. 但是我们现在有了一个连接两棵 ...
- a[b]和b[a]区别
#include <stdio.h> main() { char a[5] = "abcd"; int b = 3; printf("%c\n",a ...
- 033:DTL常用过滤器(2)
date过滤器: date过滤器:将一个日期按照指定的格式,格式化成字符串.示例代码如下: views.py: from datetime import datetime def cur_date(r ...
- NOIP2015 提高组 Day T3 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共5张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4< ...
- 演示Git使用
对于新建的repository,第一次提交,完整过程: 13643@DESKTOP-K6CS6SE MINGW64 ~/Desktop/555 $ ls Readme.md run.py 13643@ ...
- Apache服务器出现Forbidden 403错误提示的解决方法
默认web目录/var/www/html 改成 /data/www出现403问题解决: vim /etc/apache2/apache2.conf <Directory /data/www/&g ...
- H700关闭Direct PD Mapping
Attached Enclosure doesn't support in controller's Direct mapping modePlease contact your system sup ...
- 20180715-Java 数组
double[] myList //首选方法 double myList[] //效果相同,但不是首选方法 该实例完整地展示了如何创建.初始化和操纵数组: public class TestArray ...