题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了。。。

最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行。

这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的自然不能再次调度。

不在边界上的边连一条容量为1的边表示至少留一个人,在边界上的与T的连边就设置成mid。

其他细节:

注意二分答案的时候如果是l=mid+1,r=mid这样的(l+r)/2向下取整,

l=mid,r=mid-1则(l+r)/2向上取整,否则遇到如r = l+1判断后执行l = mid这种情况就会死循环。

一开始我想直接把不再边界上的流量减一,但是这样做相当与强行把当前位置往T流了1,实际上它的1不必由它本身提供

,移动完以后的士兵不能再次移动,那么能往边界上的流量可能会减少,除非移动完以后的士兵能再次移动这样才是对的。题意坑啊。。。

#include<bits/stdc++.h>
using namespace std; const int maxn = <<;
int a[maxn],n; struct Edge
{
int v,cap,flow,nxt;
}; vector<Edge> edges;
#define PB push_back
int head[maxn]; void AddEdge(int u,int v,int c)
{
edges.PB({v,c,,head[u]});
head[u] = edges.size()-;
edges.PB({u,,,head[v]});
head[v] = edges.size()-;
} const int INF = 0x3f3f3f3f;
int S,T,cur[maxn],q[maxn],d[maxn]; bool bfs()
{
memset(d,,sizeof(d));
int l = ,r = ;
q[r++] = S; d[S] = ;
while(r>l){
int u = q[l++];
for(int i = head[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(!d[e.v] && e.cap>e.flow){
d[e.v] = d[u]+;
q[r++] = e.v;
}
}
}
return d[T];
} int dfs(int u,int a)
{
if(u == T||!a) return a;
int flow = ,f;
for(int &i = cur[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v] == d[u]+ && (f = dfs(e.v,min(e.cap-e.flow,a)))){
flow += f; a -= f;
e.flow += f; edges[i^].flow -= f;
if(!a) break;
}
}
return flow;
} int MaxFlow()
{
int flow = ;
while(bfs()){
memcpy(cur,head,sizeof(head));
flow += dfs(S,INF);
}
return flow;
} vector<int> Change; void init()
{
edges.clear();
Change.clear();
memset(head,-,sizeof(head));
} void rebuild(int cap)
{
for(int i = ; i < edges.size(); i++){
edges[i].flow = ;
}
for(int i = ; i < Change.size(); i++){
edges[Change[i]].cap = cap;
}
} int main()
{
//freopen("in.txt","r",stdin);
int Test; scanf("%d",&Test);
while(Test--){
scanf("%d",&n);
init();
S = n<<; T = S|;
int l = ,r = ;
for(int i = ; i < n; i++){
scanf("%d",a+i); r += a[i];
}
char str[maxn];
int cnt = ,sum = ;
for(int i = ; i < n; i++){
scanf("%s",str);
if(!a[i]) continue; bool border = false;
for(int j = ; j < n; j++){
if(str[j] == 'Y'){
if(a[j])
AddEdge(i,j+n,INF);
else
border = true;
}
}
AddEdge(S,i,a[i]);
AddEdge(i,i+n,INF);
if(border) Change.PB(edges.size()),AddEdge(i+n,T,),cnt++;
else AddEdge(i+n,T,),sum++;
}
int mid;
for(; l < r; sum + mid*cnt == MaxFlow()? l = mid:r = mid-)
mid = (l+r+)>>,rebuild(mid);//l = mid.上取整 l = mid+1 下取整
printf("%d\n",l);
}
return ;
}

UVA - 12264 Risk (二分,网络流)的更多相关文章

  1. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  2. uva 12264 Risk

    https://vjudge.net/problem/UVA-12264 题意: 有很多个阵地,分为敌方和己方,每个士兵可以移动到相邻的己方的阵地,但是只能移动一步. 现在要让与敌方相邻的阵地中士兵最 ...

  3. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  4. hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...

  5. POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: ...

  6. BZOJ_3993_[SDOI2015]星际战争_二分+网络流

    BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...

  7. UVA 10480 Sabotage (网络流,最大流,最小割)

    UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...

  8. 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流

    题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...

  9. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

    题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...

随机推荐

  1. Flutter实战视频-移动电商-35.列表页_上拉加载更多制作

    35.列表页_上拉加载更多制作 右侧列表上拉加载配合类别的切换 上拉加载需要一个page参数,当点击大类或者小类的时候,这个page就要变成1 provide内定义参数 首先我们需要定义一个page的 ...

  2. UVaLive 6854 City (暴力)

    题意:给定一个 n*m 的矩阵,表示有多少条道路与它相连,其中有一个-1,表示未知,道路只能横着和竖着,求-1处的值. 析:根据题意可知,一个点,与其他周围的四个点都可能相连的,也就是说肯定有共用道路 ...

  3. 7 二分搜索树的原理与Java源码实现

    1 折半查找法 了解二叉查找树之前,先来看看折半查找法,也叫二分查找法 在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引. 如下: int[] arr = new in ...

  4. iOS QQ 登录

    QQSDK 看官网的文档,确实让人头疼的一件事,说是两个资源文件,就找到了一个(TencentOpenAPI.framework),Demo中也没有找到. 接下来具体实现: 导入库: 添加SDK依赖的 ...

  5. now code——处女座的期末复习

    题目描述 快要期末考试了,处女座现在有n门课程需要考试,每一门课程需要花ai小时进行复习,考试的起始时间为bi,处女座为了考试可以不吃饭不睡觉,处女座想知道他能否复习完所有的科目(即在每一门考试之前复 ...

  6. Node中的console控制台

    1. Node中的console类似于浏览器中的控制台console,它的作用在于帮助开发人员做API的辅助测试. 2. Node中的console主要功能:REPL 2.1 read 读取你输入的内 ...

  7. POJ3715【二分匹配-增广】

    题意: N个人,有两种人,M对亲密关系,问最少删除几个人达到没有亲密关系. 思路: 最大匹配 = 最小独立集,删掉该人对最大匹配数的影响,如果没有影响,删不删都无所谓,如果有影响贼删除: 类似HDU1 ...

  8. 微信API接口文档

    传送门

  9. 集中化管理平台 — Ansible 详解

    # Ansible 简介 Ansible 类似于Saltstack,是一种集成IT系统的配置管理.应用部署.执行特定任务的开源平台.Ansible基于Python语言实现,由Paramiko和PyYA ...

  10. Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你

    很多情况大数据集群需要获取业务数据,用于分析.通常有两种方式: 业务直接或间接写入的方式 业务的关系型数据库同步到大数据集群的方式 第一种可以是在业务中编写代码,将觉得需要发送的数据发送到消息队列,最 ...