题意:动物要逃跑,工作人员要截断从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. 【锋利的JQuery-学习笔记】切换网页皮肤-且保存于Cookie

    切换网页皮肤: html片段: <head> <link rel="stylesheet" href="styles/skin/skin_0.css&q ...

  2. Memcache安全配置

    Memcache安全配置 瞌睡龙 · 2014/01/20 17:59 0x00 Memcache简介 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash ...

  3. URAL 1297 Palindrome 最长回文子串

    POJ上的,ZOJ上的OJ的最长回文子串数据量太大,用后缀数组的方法非常吃力,所以只能挑个数据量小点的试下,真要做可能还是得用manacher.贴一下代码 两个小错,一个是没弄懂string类的sub ...

  4. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

  5. Android SeekBar的OnSeekBarChangeListener

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { /** * 拖动中数值的时候 * @param f ...

  6. linux 踢出用户方法

    linux系统root用户可强制踢制其它登录用户, 首先以root登录以便查看全部的在线用户信息,可用w命令查看登录用户信息 强制踢人命令格式:pkill -kill -t tty 解释: pkill ...

  7. 李洪强iOS开发之Foundation框架—结构体

    Foundation框架—结构体 一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...

  8. Project Euler 97 :Large non-Mersenne prime 非梅森大素数

    Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...

  9. GDB笔记

    GDB是在Linux命令行下对C/C++的程序进行调试常用的一个命令,现将平时记录在本子上的笔记整理如下: 一.断点 断点类型有breakpoints, watchpoints, catchpoint ...

  10. jQuery编程基础精华02(属性、表单过滤器,元素的each,表单选择器,子元素过滤器(*),追加方法,节点,样式操作)

    属性.表单过滤器 属性过滤选择器: $("div[id]")选取有id属性的<div> $("div[title=test]")选取title属性为 ...