1779: [Usaco2010 Hol]Cowwar 奶牛战争

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 302  Solved: 131
[Submit][Status][Discuss]

Description

农场主约翰在编号为1到V (1 <= V <= 1,000)一共V片草地上跟他的邻居农场主汤姆有着一 个激烈的争吵。两个农场主目前正在这些草地上放养他们的奶牛,每片草地要不是空的,要不就 被一只属于农场主约翰或者农场主汤姆的奶牛佔领着。 农场主约翰的耐心已经消磨完了,它希望把汤姆所有的奶牛都打到四脚朝天以解决这场争端。他 当然希望可以抢占先机,并且尽可能多地打翻尽农场主汤姆的奶牛。 一共E (1 <= E <= 5,000)条双向道路连接E对草地。没有两片草地由超过一条道路连接,每 条道路恰好连接2片不同的草地。每条路径由它的两个端点P1_i和P2_i (1 <= P1_i <= V; 1 <= P2_i <= V)描述。 在他的进攻过程中,农场主约翰的每一只奶牛如果需要的话,可以走过一条单独的道路。然后, 如果她愿意,可以对相邻(也就是由一条单独的道路相连的)一片草地发动进攻,也就是把上面 的敌牛打翻。注意她可以先移动再攻击 -- 但是她不能先攻击然后再移动。 每片草地上每个时刻最多可以有一只奶牛。一只奶牛不能移动到一个已经有奶牛在上面的草地 上,尤其是上面的奶牛已经被打翻的时候。当然,如果一个草地已经被空出来了,另外一只奶牛 可以在之后走到这片草地,以取代它的位置。一只被打翻的奶牛不能再次被打翻。 农场主约翰想要了解下面两个问题: * 农场主约翰在这场战役的第一波攻击中,可以打翻农场主汤姆的多少只奶牛。 * 如何指挥他的奶牛来移动和攻击,以在这第一波攻击中,打翻最多的农场主汤姆的奶牛。 求出可以打翻的敌牛的最大数目,并按照上面的规则,构建出一个移动和攻击的命令序列来指挥 他的奶牛以打翻这个数目的敌牛。只要能打翻最多的敌牛,任何一个符合条件的序列都是可以接 受的。 考虑这样一个例子。一共有5片草地,分布在一条线上面,如果有的话,每片草地(经由'--', 见下图)连接它左边和右边相邻的草地(如果有的话)。换句话说,草地1和草地2之间有一条道 路相连,草地2到草地3之间有一条道路相连,等等。农场主汤姆('T')有两只奶牛,分别站在草 地1和草地4上面,农夫约翰('J')有2只奶牛,站在草地3和草地5上面('E'表示空的草地): 1 2 3 4 5 T -- E -- J -- T -- J 在这个情况下,农场主约翰可以把农场主汤姆的两只奶牛都打翻。第一步把草地3上的奶牛移动 到草地2。此时,现在草地上的情况是TJETJ。于是农场主约翰就可以让他两只奶牛都向左进攻。 注意,虽然一开始在草地3上面的牛可以不需移动而向右攻击,但是这样的话最右边的奶牛就无 法展开攻击了。于是唯一的可行解肯定跟上面提供的解法有着相同地移动与攻击,儘管农场主 约翰指挥他的奶牛的具体顺序可能稍微有不同。 如果你正确计算出可以打翻敌牛的最大数目但是没有给出一个命令序列(或者这个序列出错), 你将得到这个测试点的50%的分数。有一个程序会来给你的输出记分。

Input

* 第1行: 两个由空格隔开的整数: V 和 E * 第2行: 一个包含V个字符的字符串(没有空格)。其中第i个字符表示草地i一开始的状况。 'E'表示这片草地是空的;'J'表示这片草地上面有一只奶牛,这只奶牛属于农场主 约翰;'T'表示这片草地属于农场主汤姆。 * 第3到第E+2行: 第i+2行包含两个由空格隔开的整数: P1_i 和 P2_i

Output

* 第1行: 一个单独的整数,表示农场主约翰可以打翻的敌牛的最大数目。

Sample Input

5 4
TEJTJ
1 2
2 3
3 4
4 5

Sample Output

2

HINT

输出细节:

其他可行的输出为:

2
MOVE 3 2
ATTACK 5 4
ATTACK 2 1

或者

2
ATTACK 5 4
MOVE 3 2
ATTACK 2 1

其它的输出祇是改变一下命令的顺序。但是并不是所有的数据都是这样的。

Source

Gold


一只$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 奶牛战争(网络流)的更多相关文章

  1. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争

    传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...

  2. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  3. [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca

    [Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...

  4. bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛

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

  5. [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛

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

  6. bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛——树的直径

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

  7. 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 ...

  8. [Usaco2010 Hol]cowpol 奶牛政坛

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

  9. 【BZOJ】1776: [Usaco2010 Hol]cowpol 奶牛政坛

    [题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树 ...

随机推荐

  1. 两台服务器共享文件Windows和Linux

    最近遇到一个问题,新装的两台服务器死活就是挂载不上samba服务器上的文件,在输入mount挂载命令的时候提示只读什么的,尝试了在挂载的时候用只读的方式去挂载也是不行,最终发现了,缺少安装cifs包, ...

  2. 1、控制器运行一个Process进程,等待不等待的问题

    一.区别 public static async void Execute(string para, string ffmpegPath, string timestr, string Id, str ...

  3. 【转】一文搞懂C语言回调函数

    转:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 什么是回调函数 我们先来看看百度百科是如何定义回调函数的: 回调 ...

  4. ps:新建Photoshop图像

    从现在起我们开始正式地接触Photoshop,为了保证大家的快捷键设置与教程内容一致.请确认Photoshop的快捷键设置是默认值.可从菜单[编辑 键盘快捷键]打开快捷键设置,在组选项里面选择“Pho ...

  5. prototype的用法

    定义: prototype 属性使您有能力向对象添加属性和方法. 语法: object.prototype.name=value 实例: function prot(){ this.name = 'J ...

  6. mysql 5.6 datetime default now()

    CREATE TABLE `test` (   id int,   `gmt_create` datetime  DEFAULT NOW() not NULL )ENGINE=InnoDB; mysq ...

  7. Feign调用远程服务报错:Caused by: java.lang.IllegalStateException: Method getMemberInfo not annotated with HTTP method type (ex. GET, POST)

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ord ...

  8. web应用,http协议简介,web框架

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

  9. ORA-01578: ORACLE 数据块损坏 (文件号 10, 块号 57896)ORA-01110: 数据文件 10: '/data/oradata/prod35.dbf'

    https://community.oracle.com/thread/3540795 概述 ------------- 数据库坏块(corruption) 的类型可以按照坏块所属对象的不同,分为用户 ...

  10. 132、TensorFlow加载模型

    # The tf.train.Saver对象不仅保存变量到checkpoint文件 # 它也恢复变量,当你恢复变量的时候,你就不必须要提前初始化他们 # 列如如下的代码片段解释了如何去调用tf.tra ...