uva10817 dijkstra
大白书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相关推荐
- [C] Dijkstra算法——通过边实现松弛
Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...
- Codeforces.1051F.The Shortest Statement(最短路Dijkstra)
题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- Acwing--朴素dijkstra
#include <iostream> #include <cstring> using namespace std;/* 优点:可以求得[n]到任一点的最短距离;可以输入最短 ...
- Dijkstra(迪杰斯特拉)算法简介
目录 适用情形 思想 核心代码 设计实现更多功能 举例说明 适用情形 适用于权值为非负的图的单源最短路径 思想 在已知起点与终点的情况下.须有三个一维数组S,U,dis,S用于记录已经查找过的点,U则 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 最短路径 - dijkstra
dijkstra是单源点最短路算法. 借图: 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S中仅含有源.设u是G的 ...
- 图的最短路径dijkstra算法
想法是这样的: 1. 最开始要建立4个list,分别存储 a. 所有的Vertex: allVertex[] b. 一个空的Vertex list: emptyVertex[] c. 一个前缀表 pr ...
最新文章
- JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)
- 在代码中向ReportViewer动态添加数据源
- js_加入收藏夹功能
- 【玩转cocos2d-x之二十六】数据结构CCDictionary
- JavaScript学习五
- 如何设置一个严格30分钟过期的Session 1
- 维纳滤波的详细讲解(同为小白,相互取暖)
- 结合CDIB类,对图像的打开、显示、保存
- hdu 1874 畅通project续
- 集合和数组的区别_java集合最全说明
- Swift 个人学习笔记 - 01: A Swift Tour
- python3随机种子的使用及理解
- 计算机的excel的知识,计算机基础知识excel题「附答案」
- Windows 下取消活动分区的方法
- 软件测试中手机性能测试怎么做,软件测试之手机知与手机性能测试完整版.doc...
- 【Qt学习】 一键生成函数注释
- 安装系统时出现“ 计算机意外地重新启动或遇到错误 ”
- 高压共轨喷油泵、喷油枪200mpa燃油系统专用 格雷希尔快速连接器G60UHP-M12E-A601
- PHP高效生成一个不重复随机数
- DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数
热门文章
- 【java】窗口控件及字符串和异常的综合应用
- 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
- 如何产生好的词向量?
- 重要开源!CNN-RNN-CTC 实现手写汉字识别
- mysql会更改原excel吗,上传到mysql时,excel的日期发生变化
- as android.mk 变色,FFmpeg4Android:AS中使用NDK
- python forward(10)什么意思-Python turtle.forward方法代码示例
- Fixjs——自定义事件处理
- java mongodb 副本集,MongoDB副本集
- mysql表文件创建_php文件创建mysql的表