题目链接: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 ;
}

hdu2612(dijkstra)的更多相关文章

  1. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  2. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  3. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  4. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  5. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  6. Dijkstra 算法

    all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...

  7. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

  8. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  9. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

随机推荐

  1. (转)javascript中call()、apply()、bind()的用法

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  2. 负载均衡,会话保持,session同步(转)

    一,什么负载均衡一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情况 ...

  3. 多线程(三) iOS中的锁

    锁的类别:互斥锁,递归锁,条件锁,自旋锁等 锁的实现方式:NSLock,NSRecursiveLock, NSConditionLock,@synchronized,GCD的信号量等 下面说一下常用的 ...

  4. js作用域总结

    一.在ES5中,js 的作用域 js作用域,只有全局作用域与函数作用域,没有块级作用域. 1.全局作用域 var a = 10; function aaa() {alert(a) } function ...

  5. Kafka0.7运行时报错 kafka/javaapi/consumer/ConsumerConnector : Unsupported major.minor version 51.0 解决

    目前中央库中 org.apache.kafka 是用jdk1.7编译的, 故跑在1.6的jvm中会报错 解决方案: 1. 下载kafka源码, 本地sbt进行install, 编译前 java -ve ...

  6. Android SDK离线安装方法详解(加速安装)

    AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助 一,首先下载SDK的安装包,android-sdk_r10-wi ...

  7. 手机移动端网站开发流程HTML5

    手机移动端网站开发流程HTML5 最近一直在研究移动手机网站的开发,发现做手机网站没有想象中的那么难.为什么会这么说呢?我们试想下:我们连传统的PC网站都会做,难道连一个小小的手机网站难道都搞不定吗? ...

  8. wordpress汇总(持续更新)

    在wordpress上新建编辑了几个页面,总是不能正常发布预览.经调查是由于固定链接的设置有问题导致的.打开左侧栏目“设置”中的固定链接项,可以看到目前所选的是“自定义结构”型.将其更改为“朴素”型后 ...

  9. 【Lintcode】096.Partition List

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  10. Python3解leetcode Valid Parentheses

    问题描述: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if th ...