SPOJ 15. The Shortest Path 堆优化Dijsktra
You are given a list of cities. Each direct connection between two cities has its transportation cost (an integer bigger than 0). The goal is to find the paths of minimum cost between pairs of cities. Assume that the cost of each path (which is the sum of costs
of all direct connections belongning to this path) is at most 200000. The name of a city is a string containing characters a,...,z and is at most 10 characters long.
Input
s [the number of tests <= 10]
n [the number of cities <= 10000]
NAME [city name]
p [the number of neighbours of city NAME]
nr cost [nr - index of a city connected to NAME (the index of the first city is 1)]
[cost - the transportation cost]
r [the number of paths to find <= 100]
NAME1 NAME2 [NAME1 - source, NAME2 - destination]
[empty line separating the tests]
Output
cost [the minimum transportation cost from city NAME1 to city NAME2 (one per line)]
Example
Input:
1
4
gdansk
2
2 1
3 3
bydgoszcz
3
1 1
3 1
4 4
torun
3
1 3
2 1
4 1
warszawa
2
2 4
3 1
2
gdansk warszawa
bydgoszcz warszawa Output:
3
2
使用堆优化Dijsktra的代码都是一大坨的。写起来好累。
要求对堆和图论和Dijsktra算法都十分熟悉。
这次写了两个多小时,最终过了,这种题目对思维锻炼是十分有帮助的。
优先熟悉堆的主要函数有:
1 堆中的元素添加和降低值的操作
2 取出堆顶值的操作
灵活修改Dijsktra。仅仅是求两点之间的最短路径。
之前使用指针写过。这次使用静态数组和vector来表示邻接表来解决。不用指针动态分配内存,速度更加快点。
Heap的操作所实用class封装起来了。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string>
#include <map>
#include <vector>
#include <string.h> using namespace std;
const int MAX_C = 15;
const int MAX_N = 10005; struct Node
{
int des, cost;
};
vector<Node> gra[MAX_N]; void insertNeighbor(int src, int des, int cost)
{
Node n;
n.cost = cost;
n.des = des;
gra[src].push_back(n);
} struct hNode
{
int ver, dis;
};
hNode heaps[MAX_N];
int hPos[MAX_N];//指示顶点在堆中的位置 class MinHeap
{
public:
int size;
MinHeap(int s = 0): size(s) {} int lson(int rt) { return rt<<1; }
int rson(int rt) { return rt<<1 | 1; }
int parent(int rt) { return rt>>1; } void swaphNode(int l, int r)
{
hNode t = heaps[l];
heaps[l] = heaps[r];
heaps[r] = t; hPos[heaps[r].ver] = r;
hPos[heaps[l].ver] = l;
} void pushUp(int rt)
{
while (parent(rt) > 0 && heaps[parent(rt)].dis > heaps[rt].dis)
{
swaphNode(rt, parent(rt));
rt = parent(rt);
}
} void pushDown(int rt)
{
int l = lson(rt);
if (l > size) return ;
int r = rson(rt); int sma = rt;
if (heaps[sma].dis > heaps[l].dis) sma = l;
if (r <= size && heaps[sma].dis > heaps[r].dis) sma = r; if (sma != rt)
{
swaphNode(sma, rt);
pushDown(sma);
}
} void increase(int ver, int dis)
{
int rt = hPos[ver];
heaps[rt].dis = dis; pushDown(rt);
} void decrease(int ver, int dis)
{
int rt = hPos[ver];
heaps[rt].dis = dis; pushUp(rt);
} void insert(int ver, int dis)
{
size++;
heaps[size].dis = dis;
heaps[size].ver = ver;
hPos[ver] = size; pushUp(size);
} bool verIsInHeap(int ver)
{
int rt = hPos[ver];
return rt <= size;
} bool isInHeap(int rt)
{
return rt <= size;
} void extractMin()
{
swaphNode(1, size);
--size;
pushDown(1);
}
}; int dijsktra(int src, int des, int vers)
{
MinHeap mheap;
for (int v = 1; v <= vers; v++)
{
mheap.insert(v, INT_MAX);
}
mheap.decrease(src, 0); for (int v = 1; v < vers; v++)
{
if (heaps[1].ver == des) return heaps[1].dis;
int u = heaps[1].ver;
int dis = heaps[1].dis; if (dis == INT_MAX) return INT_MAX;//防止溢出 mheap.extractMin(); int n = (int)gra[u].size();
for (int j = 0; j < n; j++)
{
int ver = gra[u][j].des;
int c = gra[u][j].cost;
int rt = hPos[ver]; if (mheap.isInHeap(rt) && dis+c < heaps[rt].dis)
{
mheap.decrease(ver, dis+c);
}
}
}
return heaps[1].dis;
} int main()
{
int T, n, p, nr, cost, r, src, des;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
memset(heaps, 0, sizeof(hNode) * (n+1));
memset(hPos, 0, sizeof(int) * (n+1));
for (int i = 0; i <= n; i++)
{
gra[i].clear();
} map<string, int> msi;
char str[MAX_C];
for (int i = 1; i <= n; i++)
{
scanf("%s", str);
msi[str] = i;
scanf("%d", &p);
for (int j = 0; j < p; j++)
{
scanf("%d %d", &nr, &cost);
insertNeighbor(i, nr, cost);
}
}
scanf("%d", &r);
for (int i = 0; i < r; i++)
{
scanf("%s", str);
src = msi[str];
scanf("%s", str);
des = msi[str]; printf("%d\n", dijsktra(src, des, n));
}
}
return 0;
}
版权声明:笔者靖心脏,景空间地址:http://blog.csdn.net/kenden23/,只有经过作者同意转载。
SPOJ 15. The Shortest Path 堆优化Dijsktra的更多相关文章
- SPOJ 15. The Shortest Path 最短路径题解
本题就是给出一组cities.然后以下会询问,两个cities之间的最短路径. 属于反复询问的问题,临时我仅仅想到使用Dijsktra+heap实现了. 由于本题反复查询次数也不多,故此假设保存全部最 ...
- [CF1051F]The Shortest Statement_堆优化dij_最短路树_倍增lca
The Shortest Statement 题目链接:https://codeforces.com/contest/1051/problem/F 数据范围:略. 题解: 关于这个题,有一个重要的性质 ...
- POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...
- [CF843D]Dynamic Shortest Path
[CF843D]Dynamic Shortest Path 题目大意: 给定一个带权有向图,包含\(n(n\le10^5)\)个点和\(m(m\le10^5)\)条边.共\(q(q\le2000)\) ...
- NEU 1685: All Pair Shortest Path
题目描述 Bobo has a directed graph G with n vertex labeled by 1,2,3,..n. Let D(i,j) be the number of edg ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
- Codeforces Round #303 (Div. 2) E. Paths and Trees Dijkstra堆优化+贪心(!!!)
E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 深入理解dijkstra+堆优化
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra 对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...
- hdu-----(2807)The Shortest Path(矩阵+Floyd)
The Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- 六:Java之集合
集合包括的内容非常多,我发现一个非常好的博客,感觉自己都没有写的必要了! 链接献上 Java集合
- 意外地解决了一个WPF布局问题
原文:意外地解决了一个WPF布局问题 今天做了一个小测试,意外地将之前的一个困扰解决了,原问题见<WPF疑难杂症会诊>中的“怎么才能禁止内容撑大容器?” 以前我是在外侧嵌套Canvas容器 ...
- 批处理程序:自动上传FTP,再登陆linux服务器执行更新
----转载请注明出处:博客园-邦邦酱好 最近在学批处理程序,一直没找到能够结合工作来使用它的地方,前几天测试服务端的时候突然想到可以这样做: 写一个批处理程序,自动通过FTP上传软件包到指定的地方, ...
- Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
阅读目录 设置系统字体 安装微软的英文字体 查看系统的配置文件 借用Windows的字体 编写配置文件 在前一篇随笔中,我详细讨论了字体的分类及用途,也以Fedora 20为例,展示了字体配置的思路和 ...
- OSGI学习总结
最近的一项研究了解了一下OSGI技术,感觉OSGI尽管有一定的学习难度.可是终于掌握和推广之后将是一项对系统开发比較实用的技术.在此和大家分享一下自己的感悟. 1.什么是OSGI OSGI直译为&qu ...
- 移动web性能优化笔记
移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- OpenCms创建网站的过程示意图——专用OpenCms人们刚开始学习
很多人听说过OpenCms,我知道它的强大,只需下载并安装,最后,我们看到了久违OpenCms,我们看到了它的简单的界面,喜悦之后,但难免困惑.如何用这个东西,我如何用它来网站,从哪里开始,无从下手. ...
- 【网络可靠版】Extjs4 Treegrid 使用实例
最近调试EXTJS 4的treegrid实例,看了很多水友的文章,以及官方的demo, 没一个可靠的,全都无法显示出来.像对于我们习惯用C++的coder来说,EXTJS简直就是一群无政府土匪来维护的 ...
- 1、Cocos2dx 3.0游戏开发三找一小块前言
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...