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

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

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

不在边界上的边连一条容量为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. 【网络爬虫】【java】微博爬虫(五):防止爬虫被墙的几个技巧(总结篇)

    爬虫的目的就是大规模地.长时间地获取数据,跟我们正常浏览器获取数据相比,虽然机理相差不大,但总是一个IP去爬网站,大规模集中对服务器访问,时间一长就有可能被拒绝.关于爬虫长时间爬取数据,可能会要求验证 ...

  2. 极客时间_Vue开发实战_05.Vue组件的核心概念(1):属性

    05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...

  3. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— 准备

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

  4. E20180518-hm

    priority  n. 优先,优先权; (时间,序上的) 先,前; 优先考虑的事; [数] 优先次序;

  5. IETester for IE11, IE10, IE9, IE8, IE7 IE 6 and IE5.5 on Windows 8 desktop, Windows 7, Vista and XP

    简介: IETester是一个免费的(用于个人和专业用途)WebBrowser,允许您在Windows 8桌面,Windows 7,Vista和XP上拥有IE11,IE10,IE9,IE8,IE7 I ...

  6. std::map的删除

    void eraseMap() { int n = sizeof(MmMethod); std::map<CString, int>mapDemo; ; i < ; i++) { C ...

  7. 正向渲染路径细节 Forward Rendering Path Details

    http://www.ceeger.com/Components/RenderTech-ForwardRendering.html This page describes details of For ...

  8. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

  9. PHP在cli模式下传参说明

    命令行下输入php -help会列出所有可用的参数,如下截图: -a 代表以交互式模式运行: -c 指定ph.ini -n 不使用任何php.ini配置 -d foo[=bar] 定义一个INI实体, ...

  10. 第一篇 Nosql讲解之Redis,Memchche,MongoDb的区别

    本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Redis.Memchache.MongoDb和他们之间的区别.以下是本文章的阅读目录 一.Nosql介绍 1.Nosql简介 ...