POJ 1502 Dijkstra最短路水题
2013-09-25 00:35
316 查看
睡前无聊,水了一题
莫名其妙地就AC了
连我自己都觉得自己写得很有问题(感觉思路很乱)
比如说其他n-1个过程机全部得由第一个来连(是不是我题目看错了?),那这个就是错的
好吧再复习下Dijkstra
循环n次(n个点)
过程1,找到未访问的值最小的点,找到后将其标记为已访问
过程2,更新与该点相关的周围的点
下面附上水人的代码
莫名其妙地就AC了
连我自己都觉得自己写得很有问题(感觉思路很乱)
比如说其他n-1个过程机全部得由第一个来连(是不是我题目看错了?),那这个就是错的
好吧再复习下Dijkstra
循环n次(n个点)
过程1,找到未访问的值最小的点,找到后将其标记为已访问
过程2,更新与该点相关的周围的点
下面附上水人的代码
#include <cstring> #include <cstdio> #include <algorithm> #define MAX 120 #define INF 100000000 using namespace std; int G[MAX][MAX], d[MAX]; bool vis[MAX]; char st[120]; int atoi(char* s) { int ans = 0; for(int i = 0; i < strlen(s); i++) { ans *= 10; ans += (s[i] - '0'); } return ans; } int main() { int n, temp, sd, node; scanf("%d", &n); memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) G[i][i] = -1; for(int i = 2; i <= n; i++) { for(int j = 1; j <= i - 1; j++) { scanf("%s", st); if(st[0] == 'x') G[i][j] = G[j][i] = -1; else G[i][j] = G[j][i] = atoi(st); } } int res; memset(vis, 0, sizeof(vis)); for(int j = 1; j <= n; j++) d[j] = INF; d[1] = 0; sd = INF; for(int j = 1; j <= n; j++) { node = 0; sd = INF; for(int k = 1; k <= n; k++) if(!vis[k] && sd > d[k]) {node = k; sd = d[k];} if(!node) break; vis[node] = true; for(int k = 1; k <= n; k++) if(!vis[k] && G[node][k] != -1 && d[k] > d[node] + G[node][k]) d[k] = d[node] + G[node][k]; } int mx = -1; for(int j = 1; j <= n; j++) if(d[j] > mx) mx = d[j]; res = mx; printf("%d\n", res); }
相关文章推荐
- javascriptmvc—steal.clean
- 将Qt、OpenGL、GLSL以及Qt的Graphics-View框架结合
- CASIO显示屏驱动调试小结
- Android五岁了
- 关于IOC和DI的理解
- XML编程与应用-读取XML
- 几种常用话机设置拨号方式(脉冲音频)的方法
- .NET 和 .NET框架概览
- 百花山穿越
- C++数据结构学习错误汇总(未完)
- FLUSH TABLES WITH READ LOCK
- 两个有序数组归并为一个有序数组(去重)
- spring security 3.X 入门例子
- 13-09-25
- hadoop学习之hadoop完全分布式集群安装
- 跨数据库事务保存以及服务器的配置
- usb摄像头人脸检测软件
- 关于段选择子属性的疑惑
- Individual Project - Word frequency program
- NHibernate使用MemCache二级缓存