畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28395    Accepted Submission(s): 10289

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

 
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
 
Sample Output
2 -1
这个问题其实很简单,就是求单源最短路径的最基础的题目。这里用的是dijkstra的算法求解。
dijkstra的算法和最小生成树的prim算法如出一辙,思想基本上都是一样的(dijkstra还有贪心的思想在里边)
描述一下算法:
1.将所有的结点分成两个集合。一个集合A代表我们的解答树,另一个集合B代表没有进入解答树的结点。
(如果在集合A中那么intree[i] = 1 否则为0)
2.设定一个数组mindist[i]表示起始结点到i结点的最小距离.
3.将初始结点(也就是开始结点)加入到集合A(intree[start] = 1)中去并且mindist[i] = G[start][i]
到此为止的流程都和MST的prim算法一模一样
4.每次从B集合中找到一个节点,将其加入到A集合中,之后更新start到各个结点的mindist。(因为当这个加点加入到A集合当中后,start结点可以直接或者间接到达的结点更多了,所以mindist都需要更新)。这里就是一个贪心的思想:mindist[j] = min(mindist[j],mindist[minpos] + G[minpos][j])。其中minpos是刚刚加入到A集合的结点。
如果还有什么不太明白的地方可以看这个链接里边的图示+code :http://blog.csdn.net/u013548531/article/details/38467183
下面说一下本题目的小陷阱:
1.从i城市到j城市的道路会有多条,所以必须在读取的时候稍作处理,只存最小距离的道路(因为这里WA两次)
2.当start == end 的时候要特判一下
3.唔...这是个无向图
杭电亲测15MS
<span style="font-family:Microsoft YaHei;font-size:14px;">#include <stdio.h>
#include <string.h>
#define cost_max  100000
#define min(A,B) ( (A) < (B) ? A : B)
#define maxn 105
int sum,intree[maxn];
int G[maxn][maxn];void initialize_tree(int N)
{for(int i = 0 ; i < N ; i++)for(int j = 0 ; j < N ; j++)G[i][j] = cost_max;memset(intree,0,sizeof(intree));
}
int dijkstra(int s,int e,int N)
{int mindist[N];/*mindist[i]表示从初始节点到i结点的最小距离*/ int tempdist,node;for(int i = 0 ; i < N ; i++)mindist[i] = G[s][i];intree[s] = 1;/*把初始结点s加入A集合*/for(int i = 0 ; i < N - 1 ; i++)/*从剩下的结点中依次选取*/ {tempdist = cost_max;for(int j = 0 ; j < N ; j++){if(mindist[j] < tempdist && !intree[j]){tempdist = mindist[j];node = j;}}/*选择最小代价边*/intree[node] = 1;for(int j = 0 ; j < N ; j++)if(!intree[j])mindist[j] = min(mindist[j],mindist[node] + G[node][j]);} return mindist[e];
}
int main()
{int N,M;int vertex1,vertex2,weight,s,e;/*start and end*/while(scanf("%d%d",&N,&M) != EOF){initialize_tree(N);for(int i = 0 ; i < M ; i++){scanf("%d%d%d",&vertex1,&vertex2,&weight);if(G[vertex1][vertex2] > weight && G[vertex2][vertex1] > weight)G[vertex1][vertex2] = G[vertex2][vertex1] = weight;}scanf("%d%d",&s,&e);if(s == e)printf("%d\n",0);else{int ans = dijkstra(s,e,N);if(ans == cost_max)printf("-1\n");elseprintf("%d\n",ans);}   }return 0;
}</span>

转载于:https://www.cnblogs.com/sixdaycoder/p/4348381.html

杭电1874————单源最短路径(dijkstra)相关推荐

  1. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  2. 数据结构----单源最短路径Dijkstra

    数据结构----单源最短路径Dijkstra 原理:参考趣学数据结构 代码: stack.h 栈代码 #pragma once #include<stdio.h> #define maxS ...

  3. 单源最短路径-Dijkstra(迪杰斯特拉算法)

    迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...

  4. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  5. 单源最短路径dijkstra算法

    介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...

  6. NYOJ有趣的问题(单源最短路径dijkstra)

    思路:这题的难度主要是在建图上,建完图之后就是求单源最短路径问题.可用dijkstra算法.要注意他给出的墙的x坐标不是有序 的. #include<stdio.h> #include&l ...

  7. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

  8. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  9. 单源最短路径 dijkstra

    dijkstra是单源最短路径算法,要两个数组来维护需要的信息 dis[i]用来维护起始点到i点的最短距离,初始化为一个很大的数字 0x3f3f3f3f vis[i]用来维护是否访问过该点,初始化为0 ...

最新文章

  1. 算法--------------整数反转
  2. Win8Beta即将发布,业内普遍看好微软Windows 8
  3. MySQL—01—MySQL介绍和安装
  4. linux nginx svn 安装
  5. 函数默认形参与占位参数
  6. [react] 说说你对“在react中,一切都是组件”的理解
  7. excel字符串反转
  8. JSON中的JSON.parseArray()方法、JSON.parseObject()方法和JSON.tojsonString()方法
  9. Oracle Database Gateway 安装
  10. 步步为营 .NET 设计模式学习笔记 九、Command(命令模式)
  11. 鸿蒙冰心有其他途径得到吗,关索除了人遁礼包,还有其他途径能获得吗?
  12. Java常用知识整理
  13. Poj 1328 Radar Installation 贪心
  14. 【GAMES101】作业2--三角形光栅化
  15. RuoYi-Vue简介
  16. 商人渡河问题(MATLAB版)
  17. 计算机专业基础英语,计算机专业基础英语1.ppt
  18. 那些年这么火的MyCat你还不知道吗?
  19. python3爬虫(4)各种网站视频下载方法
  20. (转)Linux下管道的原理

热门文章

  1. LayUI数据表格复选框显示不居中问题
  2. MySQL基础命令中文解析
  3. java 文件追加 变大_用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊?...
  4. oracle 权限控制表,Oracle 用户权限管理与常用权限数据字典列表
  5. A除B求商(PAT20)高精度/低精度
  6. Frequent values
  7. 找出不是两个数组共有的元素_06.数组(练习篇)
  8. nginx服务器部署dist文件夹
  9. 最小生成树的java实现
  10. UnityShader18:立方体贴图(上)