Dijkstra算法
2015-08-23 22:06
106 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2544
#include <iostream> #include <string.h> using namespace std; const int maxnum = 105; const int maxint = 999999; int dist[maxnum]; // 表示当前点到源点的最短路径长度 int cost[maxnum][maxnum]; // 记录图的两点间路径长度 bool vistied[maxnum]; void Dijkstra(int n, int v0) { memset(vistied, 0, sizeof(vistied)); for (int i = 1; i <= n; i++) { dist[i] = cost[v0][i]; } vistied[v0] = true; dist[v0] = 0; //循环n-1次 for (int i = 2; i <= n; i++) { int min = maxint; int u; for (int j = 1; j <= n; j++) { if (!vistied[j] && min>dist[j]) { min = dist[j]; u = j; } } vistied[u] = true; //更新dist for (int j = 1; j <= n; j++) { if (!vistied[j] && min + cost[u][j] < dist[j]) { dist[j] = min + cost[u][j]; } } } } int main() { //freopen("sample_input.txt", "r", stdin); // 各数组都从下标1开始 int n, line; // 图的结点数和路径数 int p, q, len; // 输入p, q两点及其路径长度 while (1) { cin >> n >> line; // 初始化c[][]为maxint if (n == 0 && line == 0) { break; } memset(cost, maxint,sizeof(cost)); for (int i = 1; i <= line; ++i) { cin >> p >> q >> len; if (len < cost[p][q]) // 有重边 { cost[p][q] = len; // p指向q cost[q][p] = len; // q指向p,这样表示无向图 } } Dijkstra(n, 1); cout <<dist << endl; } }
相关文章推荐
- 用两个栈实现一个队列
- bootstrap
- JavaSE复习日记 : 实例化对象/构造方法和this关键字
- iOS中加速度传感器的使用
- mvn学习
- 用 ObjectMapper将JSON字符串转换为java对象时,java对象一定要有无参构造函数
- WedDriver中 如何处理table
- [Android ] 多线程操作中更新UI控件的方法
- tomcat_server.xml配置说明
- Android学习之ImageView放置gif动态图
- cglib动态代理和jdk的动态代理
- 一个网站有很大的访问量,有什么办法来解决?
- C++的 函数模板和模板函数、类模板和模板类区别
- XMl基础(三)---DOM4j 对XMl文档的解析
- LibSVM学习(四)——逐步深入LibSVM 转
- Spring JdbcTemplate Querying examples
- Yarn框架
- 脑洞大开——细胞与编程
- CodeForces #317 (div2) B.Order Book
- 了解adb的基本原理