【jzyzoj】【p1320 patrol】 巡逻(网络流最小割例题)
描述 Description
FJ有个农场,其中有n块土地,由m条边连起来。FJ的养牛场在土地1,在土地n有个新开张的雪糕店。Bessie经常偷偷溜到雪糕店,当Bessie去的时候,FJ就要跟上她。但是Bessie很聪明,她在从雪糕店返回时不会经过去雪糕店时经过的农场,因此FJ总是抓不住Bessie。
为了防止Bessie生病,FJ决定把一些诚实的狗放在一些土地(1和n除外)上,使Bessie无法在满足每块土地最多只经过一次的条件的情况下,从养牛场溜到雪糕店然后又溜回养牛场。
求出FJ最少要放多少只狗。数据保证1和n间没有直接的连边。
输入格式 Input Format
* Line 1: Two integers: N and M.
* Lines 2..M+1: Each line contains two integers A and B that describe
a trail joining fields A and B. It is possible to travel
along this trail both ways. No trail will appear twice.
输出格式 Output Format
Line 1: A single integer that tells how many fields FJ should guard.
样例输入 Sample Input
6 7
1 2
2 6
1 3
3 4
3 5
4 6
5 6
样例输出 Sample Output
1
OUTPUT DETAILS:
FJ can guard field 2 (for example). FJ could guard both fields 4 and
5, but that would require more dogs.
时间限制 Time Limitation
1s
注释 Hint
数据范围:n<=1000,m<=10000。
来源 Source
usaco
不得不说这道题细节要求是非常高的,如果不注意就会WA。。。
刚开始建图也建对了,后来想了想,还是不要用
insert(i,i,);
这种奇奇怪怪的自身相连来拆点,于是给i,i+n连边。需要注意的是,源点S,T【此题为1,n】,不需要拆。
1.然后问题就来了,建完图有数据是过不去的。经过思考【看数据】,发现是有坑的。因为你的输出是ans-1,所以如果根本没有路去汇点T,那么ans=0,这时候ans-1为-1............所以输出要特判
2.第二个坑就是很鬼畜的,,,看如下N=6的对于样例的图【忽略我画的不是双向边】
显然进行拆点后,最大流是2,最小割是1。根据此图建图时,对于给出的x,y相连,显然我们
insert(x+n,y,);
insert(y+n,x,);
然而这又是一个坑。如果x=1或者y=1,那么肯定是不需要x+n或y+n的,这里也要特判,才能解决s=1,t=n的答案。
下面是AC代码:
#include<bits/stdc++.h>
#define INF 2100000000
using std::min;
struct qaq
{
int y,v,nt;
}e[];
int rev[];
int lin[];
int q[];
int level[];
int s,t;
int len=;
int n,m;
int ans=; char buf[<<],*fs,*ft;
inline char getc(){ return (fs==ft && (ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++; }
int read()
{
char ch=getc();int x=;
while(!isdigit(ch)) ch=getc();
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-''; ch=getc();}
return x;
} void insert(int x,int y,int v)
{
e[++len].nt=lin[x]; lin[x]=len; e[len].y=y; e[len].v=v; rev[len]=len+;
e[++len].nt=lin[y]; lin[y]=len; e[len].y=x; e[len].v=; rev[len]=len-;
} void init()
{
n=read();m=read();
s=;
t=n;
for(int i=;i<n;++i) insert(i,i+n,);
for(int i=;i<=m;++i)
{
int x=read(),y=read();
if(x>y) std::swap(x,y);
if(x!=)
{
insert(x+n,y,);
insert(y+n,x,);
}
else
{
insert(,y,);
insert(y,,);
}
}
} bool make_level()
{
int head=,tail=;
q[]=s;
memset(level,-,sizeof(level));
level[s]=;
while(head++<tail)
{
int x=q[head];
for(int i=lin[x];i;i=e[i].nt)
if(e[i].v && level[e[i].y]==-)
{
level[e[i].y]=level[x]+;
q[++tail]=e[i].y;
}
}
return level[t]>=;
} int max_flow(int k,int flow)
{
if(k==t) return flow;
int maxflow=;
int v;
for(int i=lin[k];i && (maxflow<flow);i=e[i].nt)
if(e[i].v && level[e[i].y]==level[k]+)
if(v=max_flow(e[i].y,min(e[i].v,flow-maxflow)))
maxflow+=v,e[i].v-=v,e[rev[i]].v+=v;
if(!maxflow) level[k]=-;
return maxflow;
} void dinic()
{
int v;
while(make_level())
while(v=max_flow(s,INF))
ans+=v;
} int main()
{
// freopen("a.txt","r",stdin);
init();
dinic();
using std::max;
if(ans==) ans=;
printf("%d\n",ans-);
return ;
}
【jzyzoj】【p1320 patrol】 巡逻(网络流最小割例题)的更多相关文章
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- 【bzoj3774】最优选择 网络流最小割
题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan
题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...
- 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割
题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...
- 【bzoj4177】Mike的农场 网络流最小割
题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...
- 【bzoj3438】小M的作物 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend/p/6801522.html 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物 ...
- 【bzoj3144】[Hnoi2013]切糕 网络流最小割
题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
- 【bzoj3894】文理分科 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...
随机推荐
- NYOJ 1237 最大岛屿 (深搜)
题目链接 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王. 这是一个由海洋. ...
- 如何升级nodejs版本 安装n模块报错 npm ERR! notsup Unsupported platform
如何升级nodejs版本 首先安装n模块, 输入npm install -g n n模块专门用来管理nodejs的版本. 如果出现npm ERR! notsup Unsupported platfor ...
- Xutils使用详解
刚开始的时候,在 GitHub 上面出现了一款强大的开源框架叫 xUtils,里面包含了很多实用的android工具,并且支持大文件上传,更全面的 http 请求协议支持(10种谓词),拥有更加灵活的 ...
- 使用Sysmon分析宏病毒(Macros Downloader)
样本为一个Word文件,Virustotal地址: https://www.virustotal.com/#/file/f8aede78ad92bd28f5f699b677d7d5fd362c8be8 ...
- Linux内核通知链机制的原理及实现【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/11/11/2396781.html 一.概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其 ...
- nodejs 使用redis 管理session
一.在开发机安装redis并远程连接 因本人的远程开发机配置原因,使用jumbo安装redis 首先登录开发机,并使用jumbo 安装redis:jumbo install redis 查看redis ...
- FineReport——JS二次开发(自定义翻页按钮)
FR允许自定义工具栏上面的按钮,并提交JS方法: 对于翻页功能,大概有首页,下一页,上一页,最后一页,以及跳转页等功能. 不得不说的是,在HTML页面自定义的按钮如何获取到报表模板,通过FR提供的JS ...
- html,图片上传预览,input file获取文件等相关操作
input file常用方法: var obj=document.getElementById("upimage"); var file=obj.files[0];//获取文件数据 ...
- hdu 2883(构图+最大流+压缩区间)
kebab Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- AC日记——大爷的字符串题 洛谷 P3709
大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...