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

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

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

不在边界上的边连一条容量为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. 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上

    一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...

  2. 3.1 HiveServer2.Beeline JDBC使用

    https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients 一.HiveServer2.Beeline 1.HiveSer ...

  3. CSS3:nth-child()伪类选择器,Table表格奇偶数行定义样式

    转自爱设计 原文链接http://www.dangshopex.com/jishufenxiang/WEBkaifajishu/8653.html CSS3的强大,让人惊叹,人们在惊喜之余,又不得不为 ...

  4. hdu3949XOR(线性基)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题目大意:求一堆数字能异或出的第$k$大的数是多少 线性基求第k大好珂怕…… 据大佬们说就是把$k$给二进制拆分,如果$k$的第$i$位为1,那么$ ...

  5. MySQL 分区简介

    MySQL自5.1开始对分区(Partition)有支持. = 水平分区(根据列属性按行分)=举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. 水平分 ...

  6. pycharm中模块matplolib生成图表出现中文乱码解决方法

    在python文件中加入如下两行 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中 ...

  7. 最新的vue没有dev-server.js文件,如何进行后台数据模拟?

    最新的vue里dev-server.js被替换成了webpack-dev-conf.js 在模拟后台数据的时候直接在webpack-dev-conf.js文件中修改 第一步,在const portfi ...

  8. 设置导航栏 self.navigationItem.titleView 居中

    喜欢交朋友的加:微信号 dwjluck2013-(void)viewDidLayoutSubviews{ [self setDisplayCustomTitleText:@"每日头条&quo ...

  9. JQuery基础知识梳理篇

    这周没事,优化线上项目,因为前端都在赶项目,我又若菜.于是前端数据展示也要自己来.看javascript看到吐,决定梳理一下Jquery基础知识.敲黑板) 闲扯结束,进入正题. 选择器 介绍 jque ...

  10. POJ-1258-Agri Ned

    链接:https://vjudge.net/problem/POJ-1258#author=fuxianda 题意: 有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么 ...