uva 12264 Risk
https://vjudge.net/problem/UVA-12264
题意:
有很多个阵地,分为敌方和己方,每个士兵可以移动到相邻的己方的阵地,但是只能移动一步。
现在要让与敌方相邻的阵地中士兵最少的最多。
思路:
最少的最多,那显然二分。
二分这个最少的值。拆点,敌方阵地不管,S向己方阵地\(i\)向连边,容量为本阵地士兵的数量,\(i'\)向T连边,如果是与敌方相邻的阵地,那么容量为二分的值;如果是处于己方阵地的包围,那么容量为1即可。最后跑最大流判断是否满流。
STD:
本STD在uva上AC,uvalive上WA,请谨慎食用。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 205;
int a[N];
char s[N][N];
bool is[N];
struct edge
{
	int u,v,cap;
	edge(int u,int v,int cap):u(u),v(v),cap(cap){}
	edge(){}
};
vector<edge> es;
vector<int> G[N];
int n,S,T;
int dis[N],cur[N];
void adde(int u,int v,int cap)
{
	es.push_back(edge(u,v,cap));
	es.push_back(edge(v,u,0));
	int sz = es.size();
	G[u].push_back(sz-2);
	G[v].push_back(sz-1);
}
bool bfs()
{
	memset(dis,inf,sizeof dis);
	dis[S] = 0;
	queue<int> q;
	q.push(S);
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		for (int i = 0;i < G[u].size();i++)
		{
			edge &e = es[G[u][i]];
			int v = e.v;
			if (e.cap > 0 && dis[v] >= inf)
			{
				dis[v] = dis[u] + 1;
				q.push(v);
			}
		}
	}
	return dis[T] < inf;
}
int dfs(int u,int flow)
{
	if (u == T) return flow;
	for (int i = cur[u];i < G[u].size();i++)
	{
		cur[u] = i;
		edge &e = es[G[u][i]];
		int v = e.v;
		if (dis[v] == dis[u] + 1 && e.cap > 0)
		{
			int tmp = dfs(v,min(e.cap,flow));
			if (tmp)
			{
				e.cap -= tmp;
				es[G[u][i]^1].cap += tmp;
				return tmp;
			}
		}
	}
	return 0;
}
int dinic()
{
	int ans = 0;
	while (bfs())
	{
		int tmp;
		memset(cur,0,sizeof(cur));
		while (tmp = dfs(S,inf)) ans += tmp;
	}
	return ans;
}
bool meet(int lim)
{
	for (int i = 0;i < N;i++) G[i].clear();
	es.clear();
	for (int i = 1;i <= n;i++)
	{
		if (a[i] <= 0) continue;
		adde(S,i,a[i]);
		adde(i,i+n,inf);
	}
	int sum = 0;
	for (int i = 1;i <= n;i++)
	{
		if (a[i] <= 0) continue;
		if (is[i])
		{
			sum += lim;
			adde(i+n,T,lim);
		}
		else
		{
			sum++;
			adde(i+n,T,1);
		}
	}
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= n;j++)
		{
			if (i == j) continue;
			if (a[i] <= 0 || a[j] <= 0) continue;
			if (s[i][j] == 'Y')
			{
				adde(i,j+n,inf);
			}
		}
	}
	int ans = dinic();
	return ans >= sum;
}
int main()
{
	int t;
	scanf("%d",&t);
	while (t--)
	{
		memset(is,0,sizeof is);
		scanf("%d",&n);
		S = 0;
		T = 2 * n + 1;
		for (int i = 1;i <= n;i++)
		{
			scanf("%d",&a[i]);
		}
		for (int i = 1;i <= n;i++)
		{
			scanf("%s",s[i]+1);
		}
		for (int i = 1;i <= n;i++)
		{
			for (int j = 1;j <= n;j++)
			{
				if (a[i] > 0 && a[j] <= 0)
				{
					if (s[i][j] == 'Y') is[i] = true;
				}
			}
		}
		int l = 1,r = 1e5;
		while (r - l > 1)
		{
			int mid = (l + r) >> 1;
			if (meet(mid)) l = mid;
			else r = mid;
		}
		while (meet(l+1)) l++;
		printf("%d\n",l);
	}
	return 0;
}
/*
3
1 1 0
NYN
YNY
NYN
7
7 3 3 2 0 0 5
NYNNNNN
YNYYNNN
NYNYYNN
NYYNYNN
NNYYNNN
NNNNNNY
NNNNNYN
4
2 2 0 0
NNYN
NNNY
YNNN
NYNN
*/
uva 12264 Risk的更多相关文章
- UVA - 12264 Risk (二分,网络流)
		题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的 ... 
- Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。
		/** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ... 
- 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
		书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ... 
- UVa 567: Risk
		这是一道很简单的图论题,只要使用宽度优先搜索(BFS)标记节点间距离即可. 我的解题代码如下: #include <iostream> #include <cstdio> #i ... 
- UVA 567	Risk【floyd】
		题目链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=508">https://uva ... 
- LA 3353 最优巴士线路设计
		给出一个 n 个点的有向图,找若干个圈,是的每个结点恰好属于一个圈.要求总长度尽量小. 三倍经验题 Uva 12264,HDU 1853 这题有两种解法,一是匹配: 每个点只在一个圈中,则他有唯一的前 ... 
- uva oj 567 - Risk(Floyd算法)
		/* 一张有20个顶点的图上. 依次输入每个点与哪些点直接相连. 并且多次询问两点间,最短需要经过几条路才能从一点到达另一点. bfs 水过 */ #include<iostream> # ... 
- UVA - 1025 A Spy in the Metro[DP DAG]
		UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ... 
- UVa12264 Risk(最大流)
		题目 Source https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ... 
随机推荐
- cmake 在mac系统的安装
			CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ... 
- NProgress颜色的修改以及在Vue中的使用
			一.NProgress的作用是在站内进行页面之间的跳转的时候,在浏览器的顶部显示一个进度,使用非常简单,可以在百度一下. 二.如何修改NProgress默认的进度条颜色?如下图,修改为自己想要的颜色即 ... 
- OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
			之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构后,再重点学习自己感兴趣的部分的话,就会有一览众山小的感觉,于是,就决定写出这篇文章,作为启程OpenCV系列博文的第二 ... 
- Redis 是怎么实现 “附近的人” 的?
			针对"附近的人"这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现. 而Redis另辟蹊径,结合其有序队列zset以及geohas ... 
- 剑指offer4:重建二叉树(后序遍历)
			1. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4 ... 
- 北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为
			作者:戴老板:微信公众号:饭统戴老板(ID: worldofboss) 2003年5月,北京SARS疫情紧张,摩托罗拉集团总裁迈克·扎菲罗夫斯基(Mike Zafirovski)却准备不走寻常路,决定 ... 
- 垃圾分类API
			###自从上月开始实行垃圾分类,整个上海人都已经“疯掉”了.那么,我们应该怎么识别什么是“垃圾”呢? 这里,我提供了并整理了几个api,其中包括图像识别,垃圾分类查找,根据关键字或者图片的内容来进行查 ... 
- 作业6:Java虚拟机类加载机制
			一.概述 1.定义 虚拟机类加载机制:把类的数据从Class文件加载进内存,并对数据作校验.转换解析和初始化,最终形成可被JVM直接使用的Java类型. 2.与C/C++的不同 Java不在编译时进行 ... 
- java——HashSet中add()方法不能加重复值得原因理解(我们一起来看底层代码吧)
			Set<String> names = new HashSet<>(); names.add("张三"); names.add(new String(&qu ... 
- Eclipse 设置新建文件默认编码为 utf-8 的方法
			选择编辑器顶部 Windows->Preferences->搜索jsp->选择utf-8编码->保存. 
