BZOJ 1632 [Usaco2007 Feb]Lilypad Pond:spfa【同时更新:经过边的数量最小】【路径数量】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1632
题意:
有一个n*m的池塘。0代表水,1代表荷花,2代表岩石,3代表起点,4代表终点。
Bessie在练芭蕾舞,她要从起点跳到终点去。
她只能走“日”字形,并且只能跳到荷花上。
荷花不能长在岩石上。
问你:
(1)至少要再添加多少个荷花,才能使Bessie可以跳到终点。
(2)在(1)的前提下,让Bessie跳到终点的步数最小,并输出。
(3)在(1)(2)条件下的路径条数。
题解:
方便起见,对于每个点(x,y)可以表示成x*m+y的形式,即平面上的点在实数上的唯一映射。
第一问:
建图。
对于每个点,到水建一条边长为1的边,到荷花建一条边长为0的边。
跑一边spfa,第一问就出来了。
第二问:
在spfa中更新dis的时候,分两种情况:
(1)dis[dest]==-1 || dis[dest]>dis[now]+len
此时dis被更新,相应的step[dest]一定要变成step[now]+1。
(2)dis[dest]==dis[now]+len
dis未被更新,但step有可能更优,step[dest] = min(step[dest], step[now]+1)
第三问:
在前两问都不变的情况下,才有可能 cnt[dest] += cnt[now]。
否则cnt[dest] = cnt[now]
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define MAX_N 35
#define MAX_P 905 using namespace std; const int dx[]={-,-,-,-,,,,};
const int dy[]={-,,-,,-,,-,}; struct Edge
{
int dest;
int len;
Edge(int _dest,int _len)
{
dest=_dest;
len=_len;
}
Edge(){}
}; int n,m;
int start,over;
int dis[MAX_P];
int step[MAX_P];
long long cnt[MAX_P];
int a[MAX_N][MAX_N];
bool vis[MAX_P];
vector<Edge> edge[MAX_P];
queue<int> q; void read()
{
cin>>n>>m;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]==) start=i*m+j;
if(a[i][j]==) over=i*m+j;
}
}
} inline bool is_legal(int x,int y)
{
return x>= && x<n && y>= && y<m;
} void build_graph()
{
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
for(int k=;k<;k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(is_legal(x,y) && a[x][y]!=)
{
edge[i*m+j].push_back(Edge(x*m+y,a[x][y]==));
}
}
}
}
} int get_front()
{
int now=q.front();
q.pop();
vis[now]=false;
return now;
} void insert(int now)
{
if(vis[now]) return;
q.push(now);
vis[now]=true;
} void spfa(int start)
{
memset(dis,-,sizeof(dis));
memset(step,0x3f,sizeof(step));
memset(cnt,,sizeof(cnt));
memset(vis,false,sizeof(vis));
insert(start);
dis[start]=;
step[start]=;
cnt[start]=;
while(!q.empty())
{
int now=get_front();
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(dis[temp.dest]==- || dis[temp.dest]>dis[now]+temp.len)
{
dis[temp.dest]=dis[now]+temp.len;
step[temp.dest]=step[now]+;
cnt[temp.dest]=cnt[now];
insert(temp.dest);
}
else if(dis[temp.dest]==dis[now]+temp.len)
{
if(step[temp.dest]>step[now]+)
{
step[temp.dest]=step[now]+;
cnt[temp.dest]=cnt[now];
insert(temp.dest);
}
else if(step[temp.dest]==step[now]+)
{
cnt[temp.dest]+=cnt[now];
insert(temp.dest);
}
}
}
}
} void solve()
{
build_graph();
spfa(start);
} void print()
{
cout<<dis[over]<<endl;
if(dis[over]!=-)
{
cout<<step[over]<<endl;
cout<<cnt[over]<<endl;
}
} int main()
{
read();
solve();
print();
}
BZOJ 1632 [Usaco2007 Feb]Lilypad Pond:spfa【同时更新:经过边的数量最小】【路径数量】的更多相关文章
- BZOJ 1632: [Usaco2007 Feb]Lilypad Pond
		
题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 390 Solved: 109[ ...
 - bzoj 1632: [Usaco2007 Feb]Lilypad Pond【bfs】
		
直接bfs,在过程中更新方案数即可 #include<iostream> #include<cstdio> #include<queue> using namesp ...
 - 1632: [Usaco2007 Feb]Lilypad Pond
		
1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 404 Solved: 118[Sub ...
 - 【BZOJ】1632: [Usaco2007 Feb]Lilypad Pond(bfs)
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1632 我简直是个sb... ... bfs都不会写.. 算方案还用2个bfs! 都不会整合到一个! ...
 - BZOJ1632: [Usaco2007 Feb]Lilypad Pond  SPFA+最短路计数
		
Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...
 - bzoj1632 [Usaco2007 Feb]Lilypad Pond
		
Description Farmer John 建造了一个美丽的池塘,用于让他的牛们审美和锻炼.这个长方形的池子被分割成了 M 行和 N 列( 1 ≤ M ≤ 30 ; 1 ≤ N ≤ 30 ) 正方 ...
 - BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
		
一傻逼题调了两天.. n<=30 * m<=30的地图,0表示可以放平台,1表示本来有平台,2表示不能走,3起点4终点,走路方式为象棋的日字,求:从起点走到终点,至少要放多少平台,以及放平 ...
 - BZOJ 1631: [Usaco2007 Feb]Cow Party( 最短路 )
		
这道题和蔡大神出的今年STOI初中组的第二题几乎一模一样... 先跑一遍最短路 , 再把所有边反向 , 再跑一遍 , 所有点两次相加的最大值即为answer --------------------- ...
 - BZOJ 1631: [Usaco2007 Feb]Cow Party
		
题目 1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 491 Solved: 362[Sub ...
 
随机推荐
- uibutton 使用settitle后如何修改其中文字对齐方式
			
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = CGRectMake(5, s ...
 - STL源代码剖析 容器 stl_deque.h
			
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie deque ---------------------------------------- ...
 - 我是如何通过CSRF拿到Shell的
			
织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有 ...
 - Smart3D系列教程8之 《模型合并——相邻地区多次建模结果合并》
			
迄今为止,Wish3D已经出品推出了7篇系列教程,从倾斜摄影的原理方法.采集照片的技巧.Smart3D各模块的功能应用.小物件的照片重建.大区域的地形重建到DSM及正射影像的处理生产,立足于建模软件的 ...
 - OpenSceneGraph FAQ 【转】
			
1.地球背面的一个点,计算它在屏幕上的坐标,能得到吗? 不是被挡住了吗? 答:计算一个空间点的屏幕坐标,使用osgAPEx::GetScreenPosition函数.当空间点处于相机视空间内(不管它是 ...
 - tomcat7设置usernamepassword
			
因为tomcat是绿色版.今天想在网页上管理项目,却发现没实username和password.打开tomcat-users.xml文件全都是凝视.如图: 将例如以下代码拷贝到tomcat-users ...
 - mysql 导入sql文件时自动切换了大小写
			
windows环境下: 解决办法(即将其改为大小写敏感): 在my.ini中添加 lower_case_table_names=1
 - angularJS  contenteditable  指令双向绑定
			
项目遇到需求有点奇葩:双击div使其可编辑,失去焦点后进行数据绑定 通过自定义指令完成 好了上代码: .directive('contentEditable', function() { return ...
 - angularJS 常用插件指令
			
长时间没有登入博客园了,今天突然想了想,当初开这个的目的,其实就是为了记录你当下的一个状态和累计一些问题,所以记录这些还是很有意义,毕竟不是什么牛,靠脸又吃不饱的这个年代,需要留下一些东西给自己看也好 ...
 - caffe搭建以及初步学习--win7-vs2013-gtx650tiboost-cuda8.0-cifar10训练和测试-2-快速解决方案cifar10_quick_solver.prototxt
			
首先安装好显卡----已经装好了?喜大普奔!没装好?那就用cpu,也是一样的. 拷贝cudnn v5.0 头文件和库文件以及执行文件到cuda8中 -------------------------- ...