nyoj677 谍战
本题能够说是最小割入门级题目。
假设能想到是最小割问题。那么建图思路便是水到渠成的事了。
加入一个源点S和汇点T;
把S与每一个间谍相连。容量为无穷大;
把城市N(即飞机场的位置)与汇点T相连。容量为无穷大;
之间有道路的城市相连。容量为1,注意这里是双向的边;
建图完后,依据最大流最小割定理。那么直接求最大流就可以。
闲话少说,上代码:
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm> #define INS 1<<30
#define CLR(arr,v) memset(arr,v,sizeof(arr)) #define MaxV 3000
#define MaxE 100000 class MaxFlow{
public:
void Clear(){
CLR(h,-1); CLR(cnt,0); CLR(vis,0);
flag = false;
pos = top = head = total = maxflow = 0;
}
void add(int u,int v,int flow){
num[pos] = v;
sur[pos] = flow;
next[pos] = h[u];
h[u] = pos++; num[pos] = u;
sur[pos] = 0;
next[pos] = h[v];
h[v] = pos++;
}
int GetMaxFlow(int s,int t){
init(t);
stk[top] = s;
while(!flag){
minres = INS;
if(top < 0) top = 0;
if(!dfs(stk[top],-1,t,minres)) continue;
maxflow += minres;
while(dis != -1){
sur[dis] -= minres;
sur[dis^1] += minres;
dis = pre_e[dis];
}
top = 0;
}
return maxflow;
}
private:
int h[MaxV],num[MaxE],sur[MaxE],next[MaxE],gap[MaxV],cnt[MaxV],pre_e[MaxE],stk[MaxV],que[MaxV];
int pos,top,head,total,maxflow,minres,dis;
bool vis[MaxV],flag;
void init(int n){
que[total++] = n;
vis[n] = true;
while(head < total){
int p = que[head++];
if(head >= MaxV) head -= MaxV;
for(int i = h[p]; i != -1 ;i = next[i]){
if(!vis[ num[i] ]){
vis[ num[i] ] = true;
gap[ num[i] ] = gap[p] + 1;
cnt[ gap[ num[i] ] ]++;
que[total++] = num[i];
if(total >= MaxV) total -= MaxV;
}
}
}
}
bool dfs(int p,int father,int n,int &minres){
int m = minres;
for(int i = h[p]; i != -1 ;i = next[i]){
if(sur[i] > 0 && gap[p] - gap[ num[i] ] == 1){
minres = min(minres,sur[i]);
pre_e[i] = father;
if(num[i] != n) stk[++top] = num[i];
if(num[i] == n || dfs(num[i],i,n,minres)) {
if(num[i] == n) dis = i;
return true;
}
minres = m;
}
}
cnt[ gap[p] ]--;
cnt[ gap[p] + 1]++;
top--;
if(cnt[ gap[p] ] == 0) flag = true;
gap[p] += 1;
return false;
}
}T; int main()
{
int t;
scanf("%d",&t);
int cnt = 0;
while (t--)
{
int n,m,p;
scanf("%d%d%d",&n,&m,&p); int N = n + 1;
T.Clear(); int x;
for (int i = 1; i <= p; ++ i)
scanf("%d",&x),T.add(0,x,INS); for (int i = 1; i <= m; ++ i)
{
int u,v;
scanf("%d%d",&u,&v);
T.add(u,v,1);
T.add(v,u,1);
} T.add(n,N,INS); printf("Case #%d: %d\n",++cnt,T.GetMaxFlow(0,N));
}
return 0;
}
nyoj677 谍战的更多相关文章
- 黑客炼金术士 Seeker:可以攻破 4G 摸到你短信,还要为朝阳群众提供谍战工具
在北京上地的一家咖啡馆里,我在等待黑客 Seeker 的到来. 我对黑客 Seeker 颇有期待.他曾在黑客大会 KCon 上演讲<伪基站高级利用技术——彻底攻破短信验证码>,介绍利用 L ...
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- 关于试用jquery的jsonp实现ajax跨域请求数据的问题
我们在开发过程中遇到要获取另一个系统数据时,就造成跨域问题,这就是下文要说的解决办法: 先我们熟悉下json和jsonp的区别: 使用AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交 ...
- [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
本文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两 ...
- json jsonp的区别
前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...
- JSON和JSONP (含jQuery实例)(share)
来源:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两个问 ...
- 【转载】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可 ...
- json和jsonp(json是目的,jsonp是手段)
自己理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的" ...
- 说说JSON和JSONP,也许你会豁然开朗(转)
前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...
随机推荐
- 爪哇国新游记之二十九----访问URL获取输入流
代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...
- xunsearch使用namespace后bug修复
xunsearch在使用了namespace后会出现不能正常使用 错误例如以下: Fatal error: Uncaught [vendors\xunsearch\lib\XSException] . ...
- MPTCP 源码分析(三) 子路径选择
简述: 支持MPTCP的链路中存在多条子路径,因此在发送数据的时候需要选择最优路径来进行操作. MPTCP利用内核通知链对MPTCP中各子路径进行增加路径.删除路径.修改路径优先级的操作.M ...
- DriverStore文件夹特别大,能删除吗?
DriverStore文件夹特别大,能删除吗? DriverStore\FileRepository文件夹特别大,能删除吗? C:\Windows\System32\DriverStore\FileR ...
- Sencha Touch开发完整流程快速讲解
1.目录 移动框架简介,为什么选择Sencha Touch? 环境搭建 创建项目框架,框架文件简介 创建简单Tabpanel案例 自定义图标的方式 WebApp产品测试和发布 HTML5离线缓存 发布 ...
- JAVA IO操作:数据操作流:DataOutputStream和DataInputStream
掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的 ...
- leetcode 43 Multiply Strings 大数相乘
感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(nu ...
- 轻松学习JavaScript十四:JavaScript的RegExp对象(正則表達式)
一RegExp对象概述 RegExp对象表示正則表達式,RegExp是正則表達式的缩写.它是对字符串运行模式匹配的强大工具. RegExp 对象用于规定在文本中检索的内容. 当您检索某个文本时.能够使 ...
- c语言编写51单片机中断程序,执行过程是怎样的?
Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序:#include<reg52.h> void main(void) { EA=1; //开放总中断 E ...
- C#微信公众号学习 - (一)测试账号申请
主要分为两部分: 1.创建C#的项目,并发布, 2.微信填写发布的地址进行开发者验证. 一. VS环境为VS2017,创建项目时,自带的一些东西发布会导致各种错误,无奈,创建了空项目aspx窗体,如下 ...