大白书P330

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1000+10;
const int INF = 1000000000;
struct Edge{int from,to,dist;
};
struct HeapNode{int d,u;bool operator <(const HeapNode &rhs)const {return d>rhs.d;}
};
struct Dijkstra{int n,m;vector<Edge> edges;vector<int>G[maxn];bool done[maxn];int d[maxn];int p[maxn];void inti(int n){this->n=n;for(int i=0; i < n; ++i)G[i].clear();edges.clear();}void AddEdge(int from, int to, int dist){edges.push_back((Edge){from,to,dist});int m =edges.size();G[from].push_back(m-1);}void dijkstra(int s){priority_queue<HeapNode> Q;for(int i=0; i<n; i++) d[i]=INF;d[s] = 0;memset(done, false,sizeof(done));Q.push((HeapNode){0,s});while(!Q.empty()){HeapNode x =Q.top();Q.pop();int u =x.u;if(done[u])continue;done[u] =true;for(int i=0; i<G[u].size(); ++i){Edge &e = edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to] = d[u] +e.dist;p[e.to]  = G[u][i];Q.push((HeapNode){d[e.to],e.to});}}}}
}solve1;
vector<int> R[maxn];
int dp[maxn];
int dfs(int u){if(dp[u]!=-1)  return dp[u];if(u==1) return 1;dp[u]=0;for(int i =0 ; i<R[u].size(); i++){int v = R[u][i];dp[u]+=dfs(v);}return dp[u];
}
int main()
{int n,m;while(scanf("%d",&n)==1&&n){scanf("%d",&m);solve1.inti(n);for(int i = 0; i<m; ++i){int u,v,d;scanf("%d%d%d",&u,&v,&d); u--,v--;solve1.AddEdge(u,v,d);solve1.AddEdge(v,u,d);}solve1.dijkstra(1);for(int i = 0; i<n; i++) R[i].clear();for(int i = 0; i < solve1.edges.size(); ++i){int u=solve1.edges[i].from, v=solve1.edges[i].to;if(solve1.d[u]>solve1.d[v])R[u].push_back(v);}memset(dp,-1,sizeof(dp));printf("%d\n",dfs(0));}return 0;
}

View Code

转载于:https://www.cnblogs.com/Opaser/p/4320090.html

uva10817 dijkstra相关推荐

  1. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  2. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  3. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  4. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  5. Acwing--朴素dijkstra

    #include <iostream> #include <cstring> using namespace std;/* 优点:可以求得[n]到任一点的最短距离;可以输入最短 ...

  6. Dijkstra(迪杰斯特拉)算法简介

    目录 适用情形 思想 核心代码 设计实现更多功能 举例说明 适用情形 适用于权值为非负的图的单源最短路径 思想 在已知起点与终点的情况下.须有三个一维数组S,U,dis,S用于记录已经查找过的点,U则 ...

  7. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  8. 最短路径 - dijkstra

    dijkstra是单源点最短路算法. 借图: 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S中仅含有源.设u是G的 ...

  9. 图的最短路径dijkstra算法

    想法是这样的: 1. 最开始要建立4个list,分别存储 a. 所有的Vertex: allVertex[] b. 一个空的Vertex list: emptyVertex[] c. 一个前缀表 pr ...

最新文章

  1. JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)
  2. 在代码中向ReportViewer动态添加数据源
  3. js_加入收藏夹功能
  4. 【玩转cocos2d-x之二十六】数据结构CCDictionary
  5. JavaScript学习五
  6. 如何设置一个严格30分钟过期的Session 1
  7. 维纳滤波的详细讲解(同为小白,相互取暖)
  8. 结合CDIB类,对图像的打开、显示、保存
  9. hdu 1874 畅通project续
  10. 集合和数组的区别_java集合最全说明
  11. Swift 个人学习笔记 - 01: A Swift Tour
  12. python3随机种子的使用及理解
  13. 计算机的excel的知识,计算机基础知识excel题「附答案」
  14. Windows 下取消活动分区的方法
  15. 软件测试中手机性能测试怎么做,软件测试之手机知与手机性能测试完整版.doc...
  16. 【Qt学习】 一键生成函数注释
  17. 安装系统时出现“ 计算机意外地重新启动或遇到错误 ”
  18. 高压共轨喷油泵、喷油枪200mpa燃油系统专用 格雷希尔快速连接器G60UHP-M12E-A601
  19. PHP高效生成一个不重复随机数
  20. DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数

热门文章

  1. 【java】窗口控件及字符串和异常的综合应用
  2. 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
  3. 如何产生好的词向量?
  4. 重要开源!CNN-RNN-CTC 实现手写汉字识别
  5. mysql会更改原excel吗,上传到mysql时,excel的日期发生变化
  6. as android.mk 变色,FFmpeg4Android:AS中使用NDK
  7. python forward(10)什么意思-Python turtle.forward方法代码示例
  8. Fixjs——自定义事件处理
  9. java mongodb 副本集,MongoDB副本集
  10. mysql表文件创建_php文件创建mysql的表