UVALive 3661 Animal Run(最短路解最小割)
题意:动物要逃跑,工作人员要截断从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(最短路解最小割)的更多相关文章
- [UVALive 3661] Animal Run
图片加载可能有点慢,请跳过题面先看题解,谢谢 附:中文题面,[BZOJ1001]狼抓兔子 就要考联赛了,博客里题目的\(style\)都变了,几乎都是些套路啥的,这道题也比较套路 第一眼看这道题的感觉 ...
- hdu3870 基于最短路的最小割
题意: 给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路: 看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...
- bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- hdu-5889-最短路+网络流/最小割
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】
链接6081 度度熊的王国战略 Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 32768/132768 K (Java/Others) ...
- HDU - 3035 War(对偶图求最小割+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...
- hdu3870-Catch the Theves(平面图最小割)
Problem Description A group of thieves is approaching a museum in the country of zjsxzy,now they are ...
- bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...
随机推荐
- UVA 714 Copying Books 二分
题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...
- Codeforces Round #343 (Div. 2) C. Famil Door and Brackets
题目链接: http://codeforces.com/contest/629/problem/C 题意: 长度为n的括号,已经知道的部分的长度为m,现在其前面和后面补充‘(',或')',使得其长度为 ...
- MyEclipse2015破解版_MyEclipse 2015 stable 2.0 稳定版 破解日志
前言:在MyEclipse 2015 Stable 1.0下载安装破解日志(http://www.cnblogs.com/wql025/p/5161979.html)一文中,笔者主要讲述了该版本的破解 ...
- 【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number
数位DP 同上一题Windy数 预处理求个组合数 然后同样的方法,这次是记录一下0和1的个数然后搞搞 Orz cxlove /************************************* ...
- 指针强转和void*
C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的 ...
- .htaccess文件讲解
.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户 ...
- 项目后台判断session过期的页面代码
checksession.jsp <%@page import="com.bn.car.core.Constants"%> <%@page import=&quo ...
- 原 Linux搭建SVN 服务器2
原 Linux搭建SVN 服务器 发表于1年前(2014-08-05 17:55) 阅读(12257) | 评论(3) 31人收藏此文章, 我要收藏 赞3 摘要 Linux搭建SVN 服务器 目录 ...
- python库:fuzzywuzzy
fuzzywuzzy 用于字符串匹配率.令牌匹配等 复制代码代码如下: from fuzzywuzzy import fuzzfuzz.ratio("Hit me with your bes ...
- POJ 1745
#include <iostream> #define MAXN 10005 using namespace std; int _m[MAXN]; ]; int main() { //fr ...