本题能够说是最小割入门级题目。

假设能想到是最小割问题。那么建图思路便是水到渠成的事了。

加入一个源点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 谍战的更多相关文章

  1. 黑客炼金术士 Seeker:可以攻破 4G 摸到你短信,还要为朝阳群众提供谍战工具

    在北京上地的一家咖啡馆里,我在等待黑客 Seeker 的到来. 我对黑客 Seeker 颇有期待.他曾在黑客大会 KCon 上演讲<伪基站高级利用技术——彻底攻破短信验证码>,介绍利用 L ...

  2. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  3. 关于试用jquery的jsonp实现ajax跨域请求数据的问题

    我们在开发过程中遇到要获取另一个系统数据时,就造成跨域问题,这就是下文要说的解决办法: 先我们熟悉下json和jsonp的区别: 使用AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交 ...

  4. [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    本文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两 ...

  5. json jsonp的区别

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  6. JSON和JSONP (含jQuery实例)(share)

    来源:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两个问 ...

  7. 【转载】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可 ...

  8. json和jsonp(json是目的,jsonp是手段)

    自己理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的" ...

  9. 说说JSON和JSONP,也许你会豁然开朗(转)

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...

随机推荐

  1. window安装mysql5.7.11

    1.到mysql官网(http://dev.mysql.com/downloads/mysql/)下载压缩包,我的是win7 64位的,根据自己的系统进行下载 2.解压到自己的目录,我的是 E:\so ...

  2. 高精度整数 - a+b(王道)

    题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出: 可能有多组测试数据,对于每组数据,输出a+b的值 样例输入: 2 6 1 ...

  3. IIS支持伪静态(windows 2003)

    IIS配置支持伪静态 ISAPI Rewrite 第一:首先我们需要下载一个ISAPI_Rewrite,有精简版和完全版,一般精简版只能对服务器全局进行配置,而完整版可以对服务器上的各个网站进行伪静态 ...

  4. Android动态载入Dex机制解析

    1.什么是类载入器? 类载入器(class loader)是 Java™中的一个非常重要的概念.类载入器负责载入 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方 ...

  5. Linux Ubuntu 开机自动启动项设置方法 例:svn服务

    在init.d目录建立一个脚本文件svnd.sh # cd /etc/init.d # vim svnd.sh 输入svnd.sh内容如下(/kaifa/svn 为svn仓库目录): #!/bin/b ...

  6. zh-cn en-uk表示语言(文化)代码与国家地区对照表

    af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...

  7. oracle 创建一个用户,并且设定只能访问指定的对象

    出处:http://www.cnblogs.com/BetterWF/archive/2012/07/03/2574416.html 今天在开发接口时候,需要给接口开发公司提供一个ORACLE 用户, ...

  8. <转>C++位运算详解

    原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查 ...

  9. 更改 easyUI 的皮肤样式

    我的版本是:jquery-easyui-1.3.2.根据官方提供的皮肤样式,——在theme 里面: 只需要在引入的 页面中 link样式的地址改变即可: <link rel="sty ...

  10. 电脑 F键(功能键)的具体作用

    F1:如果你处在一个选定的程序中而需要帮助,那么请按下F1.如果现在不是处在任何程序中,而是处在资源管理器或桌面,那么按下F1就会出现Windows的帮助程序.如果你正在对某个程序进行操作,而想得到W ...