hdu 1595 find the longest of the shortest(dijkstra)
2016-05-30 20:16
435 查看
我写的超时了,看了别人的解题报告
#include <stdio.h> #include <string.h> #define INF 99999999 int map[1001][1001]; int vis[1001],dis[1001],link[1001]; int n,m; int max(int a, int b) { return a > b ? a : b; } void dijkstra(int s, int flag) { int i,j,min,pos; memset(vis,0,sizeof(vis)); for(i = 1; i <= n; ++i) dis[i] = INF; dis[s] = 0; for(i = 1; i < n; ++i) { min = INF; for(j = 1; j <= n; ++j) { if(dis[j] < min && !vis[j]) min = dis[pos = j]; } vis[pos] = 1; for(j = 1; j <= n; ++j) if(dis[pos] + map[pos][j] < dis[j]) { dis[j] = dis[pos] + map[pos][j]; if(flag)//只记录最短那条路的父节点 link[j] = pos; } } } int main() { int i,j,x,y,w; while(scanf("%d %d",&n,&m) != EOF) { for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) map[i][j] = INF; map[i][i] = 0; } while(m--) { scanf("%d%d%d",&x,&y,&w); if(w < map[x][y]) map[x][y] = map[y][x] = w; } memset(link,0,sizeof(link)); dijkstra(1,1); int ans = dis ; for(i = n; i != 1; i = link[i]) { int tem = map[i][link[i]];//当前最短路到父节点的距离先存起来 map[i][link[i]] = map[link[i]][i] = INF; dijkstra(1,0); ans = max(ans,dis ); map[i][link[i]] = map[link[i]][i] = tem;//恢复当前的最短路 } printf("%d\n",ans); } return 0; }
相关文章推荐
- json对象与json字符串的相互转换
- 在C++中使用Protocol Buffer
- Atom 检测php错误扩展linter-php
- 【hibernate】HQL初识
- 如何 操作Blob 大对象、映射派生属性 、映射组成关系
- Easy-题目31:118. Pascal's Triangle
- CentOS安装docker
- JavaScript学习笔记03
- Python之numpy教程(四):数据处理、绘图、数据统计分析
- Easy-题目30:66. Plus One
- 第六章:堆排序
- apache日志轮询技术(cronolog and rotatelogs)小结
- android中selector在java代码中使用无效的解决方案
- 线性判别函数、判定面以及感知器
- C语言课设-1
- Easy-题目29:26. Remove Duplicates from Sorted Array
- 视图调用控制器的方法
- [JavaScript] 11.JS 偶识【正则表达式】[2]
- 用SharedPreferences存储数据
- 69道Spring面试题和答案