博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj 1874 单源最短路径
阅读量:4216 次
发布时间:2019-05-26

本文共 1171 字,大约阅读时间需要 3 分钟。

这里 需要注意 输入边的时候 可能重复输入 I - > j的边 需要判断 map[I][j] > w 选择 多次输入中最小的边

dijkstra

#include
#include
#define MAX 300#define INF 999999999using namespace std;int map[MAX][MAX];int dis[MAX];bool vis[MAX];int n, m;void dijkstra(int s){ int i, j, v; memset(vis,false,sizeof(vis)); for(i = 0; i < n; ++i){ dis[i] = map[s][i]; } dis[s] = 0; vis[s] = true; while(true){ v = -1; for(int u = 0; u < n; ++u){ if(!vis[u] && ( v == -1 || dis[u] < dis[v])){ v = u; } } if(v == -1) break; vis[v] = true; for(int w = 0; w < n; ++w){ if(!vis[w] && map[v][w] < INF && map[v][w] != 0){ if(dis[w] > dis[v] + map[v][w]) dis[w] = dis[v] + map[v][w]; } } } }int main() { int i, j; int s, e; while(scanf("%d%d",&n,&m) != EOF){ for(i = 0; i < n; ++i){ for(j = 0; j < n; ++j){ if(i == j){ map[i][j] = 0; } else map[i][j] = INF; } } int a, b, w; for(i = 0; i < m; ++i){ scanf("%d%d%d",&a,&b,&w); if(map[a][b] > w) //这里要注意 可能多次输入边 I, j 选取小的 map[a][b] = map[b][a] = w; } scanf("%d%d",&s,&e); dijkstra(s); if(dis[e] == INF){ printf("%d\n",-1); } else printf("%d\n",dis[e]); } return 0; }

转载地址:http://xmimi.baihongyu.com/

你可能感兴趣的文章
c++使用宏检测类是否包含某个函数或者变量属性
查看>>
CSS之Multi-columns的column-gap和column-rule
查看>>
CSS之Multi-columns的跨列
查看>>
CSS之浮动(一)
查看>>
CSS之浮动(二)
查看>>
AtomicInteger源码解析
查看>>
CopyOnWriteArraySet源码学习
查看>>
Openfiler 配置 NFS 示例
查看>>
Oracle 11.2.0.1 RAC GRID 无法启动 : Oracle High Availability Services startup failed
查看>>
Oracle 18c 单实例安装手册 详细截图版
查看>>
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW 安装文档
查看>>
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>