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

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

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

不在边界上的边连一条容量为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. Asset Catalog Help (十)---Specifying a Resizable Area of an Image

    Specifying a Resizable Area of an Image Use the Xcode Slicing feature to specify the dimensions of a ...

  2. 4 pyspark学习---RDD

    开始新的东西,其实很多操作在第二篇的时候就有所介绍啦.在这里继续学习一遍加深一下印象. 1关于RDD (1) RDD-----Resilient Distributed Dataset,弹性分布式数据 ...

  3. 【Hadoop】HDFS笔记(二):HDFS的HA机制和Federation机制

    HA解决了HDFS的NameNode的单点问题: Federation解决了整个HDFS集群中只有一个名字空间,并且只有单独的一个NameNode管理所有DataNode的问题. 一.HA机制(Hig ...

  4. CodeForces 628B New Skateboard 思维

    B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  5. Installing cmake 2.8.8 or higher on Ubuntu 12.04 (Precise Pangolin) (转载)

    转自:http://cameo54321.blogspot.com/2014/02/installing-cmake-288-or-higher-on.html Check the version o ...

  6. vue的踩坑路

    ------>axios模拟get json一直拿不到文件,先把data放到根目录,再去dev-server.js(就是npm执行的那个文件)里面设置静态资源访问路径app.use('/data ...

  7. Linux下更改mysql版本

    想要更改linux的mysql版本,并不需要重装系统重新选择mysql版本,只需要删除掉原来的mysql然后在安装新的就可以啦 (谨记:一定要做好数据库备份) 详情请参照:大牛博客 over!over ...

  8. 阻塞调用ShellExecute函数

    SHELLEXECUTEINFO si;ZeroMemory(&si, sizeof(si));si.cbSize = sizeof(si);si.fMask = SEE_MASK_NOCLO ...

  9. HDU1829【种类并查集】

    题意: 检验给出条件是否有同性恋. 思路: 条件并查集. 还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的, 那么如果说对于同类(同一个集合)的判断就sum[a]是否等于s ...

  10. Tarjan找桥和割点与点连通分量与边连通分量【未成形】

    之前只学了个强连通Tarjan算法,然后又摸了缩点操作: 然后今天在lightoj摸了一道模板题,是求所有桥的题: 然后发现,要把:割点,割点集合,双连通,最小割边集合(桥),点连通分量,边连通分量都 ...