题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员。问最少需要多少人才能完成拦截。

通俗地讲,就是把图一分为二所造成消耗的最小值。

这里用最短路的方法解,主要是因为数据量太大,不能用最小割最大流还处理。

手动画一下这种“割”的形式,发现是从一条边到另一条边,即以边为“点”,在边与边之间见“边”,边上的权值为终点v(其实是一条边)的权值。(本来想直接用点权处理的,可coding的时候发现SPFA中的入队出队操作太繁琐,老老实实改边权了)。这里因为是以边为点,所以要对每条边编号,借用了昨天刚学到的ID()函数,很实用的。

最终的方案是整体从左下到右上,把START与END分成两部分。那么就以最左侧、最下侧的所有点为起点,做一遍最短路,求出最上侧、最右侧边所对应d[]数组的最小值,即为答案。

注:

1、因为是以边为点,共有少于n*m*3个“点”,共要建边(n-1)*(m-1)*2*3条“边”

2、不保证code是正确滴,这道题在uva挂了,难得能一次就跑出样例...偶已经很久木有一次AC了= =

 #include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define clr(a,m) memset(a,m,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=;
const int INF =1e9; struct Edge{
int v,next,c;
Edge(){}
Edge(int x,int y,int z):v(x),c(y),next(z){}
}edge[MAXN*MAXN*]; int id[MAXN][MAXN][],num;
int grid[MAXN][MAXN][]; int head[MAXN*MAXN*],tol;
int vis[MAXN*MAXN*],inq[MAXN*MAXN*],d[MAXN*MAXN*]; void read(int n,int m)
{
rep(i,,n)
rep(j,,m-)
scanf("%d",&grid[i][j][]);
rep(i,,n-)
rep(j,,m)
scanf("%d",&grid[i][j][]);
rep(i,,n-)
rep(j,,m-)
scanf("%d",&grid[i][j][]);
} void init()
{
tol=;
clr(head,-); num=;
clr(id,);
} void add(int u,int v,int cv,int cu)
{
edge[tol]=Edge(v,cv,head[u]);
head[u]=tol++; edge[tol]=Edge(u,cu,head[v]);
head[v]=tol++;
} int ID(int i,int j,int k)
{
int& x=id[i][j][k];
if(!x)x=++num;
return x;
} void build(int n,int m)//建图:原图在(n-1)*(m-1)个方格中各有两个三角形,在其内部以边为顶点建三角形,共构建(n-1)*(m-1)*2*3条边
{
init();
rep(i,,n-){
rep(j,,m-){
add(ID(i,j,),ID(i,j,),grid[i][j][],grid[i][j][]);
add(ID(i,j,),ID(i,j+,),grid[i][j+][],grid[i][j][]);
add(ID(i,j,),ID(i,j+,),grid[i][j+][],grid[i][j][]); add(ID(i,j,),ID(i,j,),grid[i][j][],grid[i][j][]);
add(ID(i,j,),ID(i+,j,),grid[i+][j][],grid[i][j][]);
add(ID(i,j,),ID(i+,j,),grid[i+][j][],grid[i][j][]);
}
}
} void SPFA(int n,int m)
{
priority_queue<int,vector<int>,greater<int> >q;
clr(inq,);
rep(i,,num)
d[i]=INF;
rep(i,,n-){
int s=id[i][][];
d[s]=grid[i][][];
q.push(s);
vis[s]=true;
}
rep(j,,m-){
int s=id[n][j][];
d[s]=grid[n][j][];
q.push(s);
vis[s]=true;
}
while(!q.empty())
{
int u=q.top();q.pop();
vis[u]=false;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
int c=edge[i].c;
if(d[v]>d[u]+c){
d[v]=d[u]+c;
if(!vis[v]){
q.push(v);
vis[v]=true;
}
}
}
}
} void print(int n,int m,int cnt)
{
int ans=INF;
rep(j,,m-)
ans=min(ans,d[id[][j][]]);
rep(i,,n-)
ans=min(ans,d[id[i][m][]]);
printf("Case %d: Minimum = %d\n",cnt,ans);
} int main()
{
int n,m,cnt=;
while(scanf("%d%d",&n,&m)==&&n)
{
read(n,m);
build(n,m);
SPFA(n,m);
print(n,m,++cnt);
}
return ;
}

UVALive 3661 Animal Run(最短路解最小割)的更多相关文章

  1. [UVALive 3661] Animal Run

    图片加载可能有点慢,请跳过题面先看题解,谢谢 附:中文题面,[BZOJ1001]狼抓兔子 就要考联赛了,博客里题目的\(style\)都变了,几乎都是些套路啥的,这道题也比较套路 第一眼看这道题的感觉 ...

  2. hdu3870 基于最短路的最小割

    题意:      给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路:       看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...

  3. BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...

  4. bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

  5. hdu-5889-最短路+网络流/最小割

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】

    链接6081 度度熊的王国战略 Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 32768/132768 K (Java/Others) ...

  7. HDU - 3035 War(对偶图求最小割+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...

  8. hdu3870-Catch the Theves(平面图最小割)

    Problem Description A group of thieves is approaching a museum in the country of zjsxzy,now they are ...

  9. bzoj 2007: [Noi2010]海拔【最小割+dijskstra】

    上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...

随机推荐

  1. EXT--columnWidth

    在EXT 3.4API上没有查询到columnWidth这个配置项,但它却实实在在的在起作用,后来在ColumnLayout类查到它的信息: 上面的信息描述了采用了columnLayout布局的子面板 ...

  2. dragsort拖动插件的使用

    <!DOCTYPE html><html><head> <title>DragSort Example</title> <meta c ...

  3. HTML5网页制作教程:HTML5块级链接

    网页制作Webjx文章简介:Web 标准中处处充满了打脸行为,这条规则现在已经失效了!在那篇文章发布一个月后,HTML5doctor 发表了 “Block-level” links in HTML5, ...

  4. Maven搭建webService (二) 创建服务端---使用web方式发布服务

    今天和大家分享 使用 web方式发布 webService 服务端.客户端 1.首先创建 一个web工程(增加Maven依赖) 2.增加Maven依赖包,如下: <!-- spring core ...

  5. 16进制串hex与ASCII字符串相互转换

    提供两个函数,方便十六进制串与ASCII 字符串之间的相互转换,使用函数需要注意的是返回的串是在堆上通过 calloc 分配的,所以,记得使用完返回值释放该块,并且将指向该块的指针 =NULL . c ...

  6. 【WCF--初入江湖】01 WCF编程概述

    01 WCF编程概述 SOA的优点 1.服务独立于平台和工作环境.服务并不关心自己所处的环境,也不关心与之进行通信的服务所处的    环境. 2.服务相互隔离. 3.服务对协议.格式和传输中立. 4. ...

  7. hdu 3807

    很好的思路     枚举有多少人有ipad 判是否满足题目给出的条件 #include <iostream> #include <cstring> #include <c ...

  8. hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)

    题目 第一次做是看了大牛的找规律结果,如下: //显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的 #include<stdio.h> int main() { ], ...

  9. POJ 1922 Ride to School(贪心+模拟)

    题意:起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度跟上 ...

  10. 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)

    比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子.   ...