hdoj1874 (优先队列+Dijkstra)
分析:
一看题目, 就是求最短路, 这道题用的是Dijkstra+优先队列。先说一下Dijkstra算法:每次扩展一个距离最短的节点, 更新与其相邻点的距离。 当所有边权都为正时, 由于不会存在一个距离更短的没有扩展的点,所以这个点的距离不会在改变, 保证了算法的正确性。
算法步骤如下:
G={V,E}
1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值
若存在〈V0,V〉,d(V0,Vi)为〈V0,Vi〉弧上的权值
若不存在〈V0,Vi〉,d(V0,Vi)为∞
2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止。
伪代码:
将所有节点状态初始化(标记为未计算)
设起始点s, d[s] = 0; 其他节点d[i] = MAX;
循环n次
{
在所有未标记的节点中, 选出d值最小的节点x;
标记节点x;
对于所有从x节点出发的所有边(x, y), 更新d[y] = min(d[y], d[x] + w(x, y));
}
对应代码:
memset(v, , sizeof(v));
for(int i = ; i < n; i++)
d[i] = 10e8;
d[s] = ;
for(int i = ; i < n; i++)
{
int mi = 10e8;
for(int j = ; j < n; j++)
{
if(v[j] == && d[j] < mi)
mi = d[j];
v[j] = ;
for(int k = ; k < n; k++)
if(d[k] < d[j] + w[j][k])
d[k] = d[j] + w[j][k];
}
}
程序的复杂度为n方, 每一次都要求所有d中的最小值。 然而STL中的优先队列priority_queue正好解决了这一问题。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std; int n, m, s, t, v[];
double d[];
struct edge
{
int v;
double d;
}e[];
struct node//存储点的信息, 起始点到x节点的最短距离d.
{
int x;
double d;
}no[];
bool operator< (node a, node b)
{
return a.d > b.d;
}
vector<edge> vec[];
double ac(int x)
{
memset(v, , sizeof(v));
priority_queue<node> q;
node tem;
tem.x = s;
tem.d = ;
q.push(tem);//将起始点加入队列
while(!q.empty())
{
node tem = q.top();//取出d值最小的
q.pop();
int x = tem.x;
if(x == t)
return tem.d;
if(v[x] == ) continue;
v[x] = ;
for(int i = ; i < vec[x].size(); i++)//更新从tem.x出发的所有边(x,y),d[y] = min(d[y], d[x]+w[x][y])
{
int y = vec[x][i].v;
if(d[y] > (tem.d + vec[x][i].d))
{
d[y] = tem.d + vec[x][i].d;
node node1;
node1.x = y; node1.d = d[y];
q.push(node1);
}
}
}
return -;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = ; i <= n; i++) vec[i].clear();
for(int i = ; i <= n; i++) d[i] = 10e8;
for(int i = ; i <= m; i++)
{
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
edge e;
e.v = y; e.d = w;
vec[x].push_back(e);//用vector存边,
e.v = x;
vec[y].push_back(e);
}
scanf("%d%d", &s, &t);
d[s] = ;
double ans = ac(s);
if(ans == -)
printf("-1\n");
else
printf("%.0lf\n", ans);
}
return ;
}
hdoj1874 (优先队列+Dijkstra)的更多相关文章
- hdu6395 /// 优先队列dijkstra
题目大意: 给定无向图的n m为点数和边数 接下来m行给定u v id表示点u到点v间有一条编号为id的边 当由一条边走到另一条边 而两条边的编号不同时 费用+1 优先队列跑dijkstra最短路 按 ...
- 最长k可重线段集问题【费用流】【优先队列Dijkstra费用流】
题目链接 与最长K可重区间问题一样的解法,但是这道题却有很多需要注意的地方,譬如就是精度问题,一开始没考虑到sprt()里面的乘会爆了精度,然后交上去竟然是TLE,然后找的原因方向也没对,最后TLE了 ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- dijkstra算法与优先队列
这是鄙人的第一篇技术博客,作为算法小菜鸟外加轻度写作障碍者,写技术博客也算是对自己的一种挑战和鞭策吧~ 言归正传,什么是dijkstra算法呢? -dijkstra算法是一种解决最短路径问题的简单有效 ...
- 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
Dijkstra+ 链式前向星+ 优先队列 Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...
- Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]
题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...
- HDU-2680 Choose the best route 单向边+反向dijkstra
https://vjudge.net/problem/HDU-2680 题意:以起始点 终点 长度 给出一个图,已知可以从w个起点出发,求从任一起点到同一个终点s的最短路径.注意是单向边.m<1 ...
- 图论-最短路径<Dijkstra,Floyd>
昨天: 图论-概念与记录图的方法 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 分割线 第二天 引子:昨天我们简单讲了讲图的概念 ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
随机推荐
- json-lib反序列化时(JSONObject.toBean),时间类型为空的处理
需求: 在我们的项目里希望JsonString传入日期类型值为空时,JSONObject.toBean时可以将Java对象的该日期属性设为null. 解决过程: json-lib反序列化Json字符串 ...
- bootstrap布局两列或者多列表单
1, 代码如下: <div class="form-group"> <label for="starttime" class="co ...
- javaweb 之javascript 结合
1.javascript的简介 * 是基于对象和事件驱动的语言,应用与客户端. - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** html做网站静态效果,javascr ...
- marvell笔试题(嵌入式软件)
有幸去Marvell参加面试,由于其要求WCDMA/GSM之类的,我还特地恶补了下这方面的知识.后来坐了2个小时的地铁后,到达了Marvell.公司还蛮不错的,里面环境都还可以.我投了这家公司也是同学 ...
- nodejs调试工具node-inspector入门随笔
最近打算玩玩node. 众所周知,在前端,调试代码有一众天然好工具——浏览器!特别是 chrome,使得 jser 们如鱼得水,玩得风生水起.但是到了node,情况就不一样了,js 代码不再运行在单纯 ...
- vijosP1016 北京2008的挂钟
vijosP1016 北京2008的挂钟 题目链接:https://vijos.org/p/1016 [思路] Dfs. 对操作搜索更加优秀,所以采用搜索每一个操作的使用次数,因为操作数为4则相当于没 ...
- Azure 虚拟机常见问题-下
虚拟机上的默认用户名和密码是什么? Azure 提供的映像没有预先配置用户名和密码.使用这些映像中的其中一个创建虚拟机时,你需要提供用户名和密码,用于登录到虚拟机. 提示 如果忘记了用户名或密码且安装 ...
- 关于Windows Azure的常见问题-执行与维护FAQ
执行与维护 使用虚拟机运行业务应用有什么需要注意的地方? Windows Azure 会周期性地更新主机环境,以确保平台上运行的所有应用程序和虚拟机始终处于安全的环境.此更新过程可能会导致您的虚拟机重 ...
- Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
任务调度接口定义: 1 IScheduler{ 2 // conf为当前nimbus的stormp配置 3 void prepare(Map conf); // 初始化 4 // to ...
- 问题-Delphi编译时提示缺少delphi自己的单元文件
问题现象:在编译工程是,提示缺少DELPHI自己的很多单元. 问题原因:这可能是因为手动误删除,或是第三方控件安装时误删除DELPHI自己的目录引起的(如果说错了,希望高人指点). 问题处理: 方法一 ...