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交接的那些边 ...
随机推荐
- c# 应用程序部署发布
转自:http://blog.csdn.net/chenyujing1234/article/details/7558185 最近做了C#软件,发布给客户用时,发现客户运行不起来,原因是客户电脑上没有 ...
- html5上传文件并监听进度
出处: http://blog.csdn.net/small_rice_/article/details/21391625
- 数字PID控制算法
增量式PID控制算法 量式PID控制算法 2009-07-18 10:33 (转载 出处blog.ednchina.com/tengjingshu )blog.ednchina.com/tengjin ...
- nenu contest
http://vjudge.net/vjudge/contest/view.action?cid=54393#overview A n^2能过 对第二个n我二分了一下,快了一点点,nlogn #inc ...
- 多线程Java Socket编程示例(转)
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...
- 01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响
这篇文章 http://ayende.com/blog/3988/nhibernate-the-difference-between-get-load-and-querying-by-id One o ...
- springMVC 简单事例
本帖最后由 悲观主义者一枚 于 2015-1-31 17:55 编辑 使用SpringMvc开发Android WebService入门教程1.首先大家先创建一个JavaWeb项目2.然后加入Spri ...
- linux上部署应用
1.编写traffic.sh 引入相关的jar包及java环境路径 2.crontab -e 加入: */10 * * * * cd /opt/sys/traffic_version/bin & ...
- SOAP vs REST
Both methods are used by many of the large players. It's a matter of preference. My preference is RE ...
- How does database indexing work?
When data is stored on disk based storage devices, it is stored as blocks of data. These blocks are ...