题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

题意:给出一个n*m的矩阵,' . ' 表示可以走的路, ' # '表示不能走的路 ,’ @'表示KCF, ‘Y' , 'M' 表示两个人开始的位置,

他们可以走到相邻的路,每走一步需要11分钟,问他们要在KCF见面,最少需要花多少时间。

思路:我们可以把矩阵化成图,再通过dijkstra求出Y和M到各个KCF的距离,然后找对应和最小的就是答案啦。

注意这里矩阵最大为200*200,所以有40000个节点,我们需要对dijkstra做堆优化,不然能会超时。

代码:

 #include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#define MAXN 210
using namespace std; vector<pair<int, int> > vec[MAXN*MAXN];//***记录图
bool vis[MAXN*MAXN];//***标记该点是否在堆中
const int inf=0x3f3f3f3f;
char mp[MAXN][MAXN];
int n, m, pos=, s1=, s2=, a[MAXN*MAXN]; struct node{//***重载比较符使优先队列非升序排列
int point, value;
friend bool operator< (node a, node b){
return a.value>b.value;
}
}; void get_vec(){//建图
for(int i=; i<MAXN*MAXN; i++){
vec[i].clear();
}
for(int i=; i<n; i++){
for(int j=; j<m; j++){
if(mp[i][j]=='@'){
a[pos++]=i*m+j;
}else if(mp[i][j]=='Y'){
s1=i*m+j;
}else if(mp[i][j]=='M'){
s2=i*m+j;
}
if(mp[i][j]!='#'){
int u=i*m+j;
if(mp[i+][j]!='#'&&i+<n){
int v=(i+)*m+j;
vec[u].push_back({v, });
vec[v].push_back({u, });
}
if(mp[i][j+]!='#'&&j+<m){
int v=i*m+j+;
vec[u].push_back({v, });
vec[v].push_back({u, });
}
}
}
}
} int &dijkstra_heap(int s, int dist[MAXN*MAXN]){//最短路求源点到其他点的距离
priority_queue<node> q;
memset(vis, false, sizeof(vis));
dist[s]=;
q.push({s, dist[s]});
while(!q.empty()){
node u=q.top();
int point=u.point;
q.pop();
if(vis[point]){
continue;
}else{
vis[point]=true;
}
for(int i=; i<vec[point].size(); i++){
int v=vec[point][i].first;
int cost=vec[point][i].second;
if(!vis[v]&&dist[v]>dist[point]+cost){//***松驰操作
dist[v]=dist[point]+cost;
q.push({v, dist[v]});
}
}
}
} int main(void){
while(scanf("%d%d", &n, &m)!=EOF){
int dist1[MAXN*MAXN], dist2[MAXN*MAXN];//***记录源点此时到 i 的最短距离
memset(dist1, 0x3f, sizeof(dist1));
memset(dist2, 0x3f, sizeof(dist2));
for(int i=; i<n; i++){
scanf("%s", mp[i]);
}
pos=;
get_vec();
dijkstra_heap(s1, dist1);
dijkstra_heap(s2, dist2);
int ans=inf;
for(int i=; i<pos; i++){
ans=min(dist1[a[i]]+dist2[a[i]], ans);
}
cout << ans* << endl;
}
return ;
}

最新文章

  1. 【从零开始学BPM,Day1】工作流管理平台架构学习
  2. 8个排序算法——java
  3. jquery版的全选,全不选和反选
  4. 把 MWeb Lite 的文档库文档和数据搬到 MWeb 正式版中
  5. 类似qq的左滑菜单栏简单实现
  6. Centos 6.7 安装smokeping (最完整教程)
  7. 【java】定时器
  8. canvas滤镜之简单的取反
  9. javascript对象属性的赋值解析
  10. C/C++中float和double的存储结构
  11. Entity Framework 使用sql语句分页(查询视图)
  12. 一道关于call和this的JS面试题
  13. 201521123011 《Java程序设计》第4周学习总结
  14. 用jquery+Asp.Net实现省市二级联动
  15. asp.net 获取 repeater checkbox 值
  16. [Oracle,2018-03-02] oracle一次插入多条记录
  17. 利用VS2017跨平台远程调试aspnetcore应用
  18. QT中文乱码与国际化支持
  19. 初始react
  20. 关于VS2010的一些操作

热门文章

  1. Spring项目中使用jackson序列化key为对象Map
  2. linux下编译安装python
  3. centos下安装nodejs及websocket
  4. 【Leetcode-easy】Roman to Integer
  5. VIM命令总结【转】
  6. 分享知识-快乐自己:Struts2中 获取 Request和Session
  7. eclipse的maven工程Dynamic Web Module 2.3 修改为3.0 解决办法
  8. L89
  9. Hotel California
  10. 洛谷 P2962 [USACO09NOV]灯Lights