单源最短路-Dijkstra算法 (poj 1502)
2015-11-24 20:02
627 查看
题目链接:http://poj.org/problem?id=1502
1.用邻接矩阵存图
2.定义mm[u][v]数组表示从u到v的路径长度,设置一个很大的值表示正无穷
3.维护dis[i]数组 表示源点1到点i的最短路径长度,初始化值为mm[1][i]
4.定义book[i]数组标记从1到i的最短路径长度是否已经确定
Dijkstra算法基本步骤:
1.将所有顶点分为两部分,最短路径长度已知,最短路径长度未知。
分别用book[i] = 1,book[i]= 0表示
最开始,只有book[1] = 1(源点)
2 .设置dis[1] = 0,若存在源点1能直接到达的点i,则设置dis[i]= mm[1][i],然后把剩下的顶点的最短路径设为正无穷
3.在book[i] = 0的所有顶点中找出离源点1最近的顶点u,即dis[u] 最小,然后对u的每一条出边进行松弛操作。然后设置book[u] = 1
例如,有一条从u到v的边,那么从源点到v的路径就有:1–>u–>v
dis[v] = min(dis[v],dis[u]+mm[u][v])
4.重复第3步,直到源点到每个顶点的最短路径都确定。
这个算法复杂度是O(N^2)
1.用邻接矩阵存图
2.定义mm[u][v]数组表示从u到v的路径长度,设置一个很大的值表示正无穷
3.维护dis[i]数组 表示源点1到点i的最短路径长度,初始化值为mm[1][i]
4.定义book[i]数组标记从1到i的最短路径长度是否已经确定
Dijkstra算法基本步骤:
1.将所有顶点分为两部分,最短路径长度已知,最短路径长度未知。
分别用book[i] = 1,book[i]= 0表示
最开始,只有book[1] = 1(源点)
2 .设置dis[1] = 0,若存在源点1能直接到达的点i,则设置dis[i]= mm[1][i],然后把剩下的顶点的最短路径设为正无穷
3.在book[i] = 0的所有顶点中找出离源点1最近的顶点u,即dis[u] 最小,然后对u的每一条出边进行松弛操作。然后设置book[u] = 1
例如,有一条从u到v的边,那么从源点到v的路径就有:1–>u–>v
dis[v] = min(dis[v],dis[u]+mm[u][v])
4.重复第3步,直到源点到每个顶点的最短路径都确定。
这个算法复杂度是O(N^2)
#include <iostream> #include <cstdio> using namespace std; int mm[105][105]; int x = 99999999,dis[105],book[105]; //dis--1号顶点到其他顶点最短路程 int main() { int n; cin>>n; for (int i = 1; i <= n; i++) { mm[i][i] = 0; } for (int i = 2; i <= n; i++) { for (int j =1; j < i; j++) { char temp[10]; int num= 0; cin>>temp; if (temp[0] == 'x') { mm[i][j] = x; mm[j][i] = x; } else { sscanf(temp,"%d",&num);//sscanf表示从字符串中格式化输入,num为整型的temp mm[i][j] = num; mm[j][i] = num; } } } for (int i =1; i <= n; i++) dis[i] = mm[1][i]; for (int i = 1; i <= n; i++) book[i] = 0; book[1] = 1; for (int i =1; i <= n-1; i++) { int min = x,t = 1; // 找到离源点最近的点 for (int j = 1; j <= n; j++) { if (book[j] == 0 && dis[j] < min) { min = dis[j]; t = j; } } book[t] = 1; // 松弛 for (int v = 1; v <= n; v++) { if (mm[t][v] < x && dis[v] > dis[t]+mm[t][v]) { dis[v] =dis[t]+mm[t][v]; } } } int max = 0; for (int i = 1;i <= n; i++) { if (dis[i] > max) { max = dis[i]; } } cout<<max<<endl; return 0; }
相关文章推荐
- 实验三
- UIImageView的图片轮播属性
- 递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- 树-C实现
- 长期在后台定时运行的服务 第一行代码
- jsp跳转servlet,servlet跳转jsp,servlet跳转servlet的路径问题
- java回调机制的理解
- java缓冲区
- 高斯混合模型 + 高斯分布回顾
- usb设备的probe全过程
- 使用java实现定时器定时删除系统文件
- 编写一个函数实现n^k,使用递归实现
- 阿里悟空学习
- 字符串的split方法
- Java中equals和==的区别
- 实现一个日期计算器
- GPU之cuda学习第三章内容总结
- Apache的用户认证
- 初步解析内核函数copy_to_user和copy_from_user
- Java 十六进制转十进制