HDU - 1874 畅通工程续(最短路径)
2015-12-03 21:40
483 查看
d.已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
s.最短路径
c.Dijkstra单源最短路
View Code
s.最短路径
c.Dijkstra单源最短路
/* Dijkstra单源最短路 权值必须是非负 单源最短路径,Dijkstra算法,邻接矩阵形式,复杂度为O(n^2) 求出源beg到所有点的最短路径,传入图的顶点数,和邻接矩阵cost[][] 返回各点的最短路径lowcost[],路径pre[].pre[i]记录beg到i路径上的父结点,pre[beg]=-1 可更改路径权类型,但是权值必须为非负 */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int MAXN=256; #define typec int const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大 bool vis[MAXN]; int pre[MAXN]; void Dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg){ for(int i=0;i<n;i++){ lowcost[i]=INF;vis[i]=false;pre[i]=-1; } lowcost[beg]=0; for(int j=0;j<n;j++){ int k=-1; int Min=INF; for(int i=0;i<n;i++) if(!vis[i]&&lowcost[i]<Min){ Min=lowcost[i]; k=i; } if(k==-1)break; vis[k]=true; for(int i=0;i<n;i++) if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){ lowcost[i]=lowcost[k]+cost[k][i]; pre[i]=k; } } } int main(){ int cost[MAXN][MAXN]; int lowcost[MAXN]; int N,M; int A,B,X; int S,T; while(~scanf("%d%d",&N,&M)){ for(int i=0;i<MAXN;++i){ for(int j=0;j<MAXN;++j){ cost[i][j]=INF; } } memset(vis,false,sizeof(vis)); for(int i=0;i<M;++i){ scanf("%d%d%d",&A,&B,&X); if(X<cost[A][B]){//重边。。 cost[A][B]=cost[B][A]=X; } } scanf("%d%d",&S,&T); Dijkstra(cost,lowcost,MAXN,S); if(lowcost[T]==INF)printf("-1\n"); else printf("%d\n",lowcost[T]); } return 0; }
View Code
相关文章推荐
- 项目冲刺(2)-第一天
- UNIX环境学习笔记------原始套接字-------如何使用man 手册查看原始套接字的相关资料?
- Python学习笔记一
- C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility
- 一种C# TCP异步编程中遇到的问题
- 【动态规划+递归】:poj1191,棋盘分割
- 文件描述符
- 一个简单的RTTI实现
- ping
- 关于无法net start mysql无法启动数据库的解决办法
- 使用Java编写并运行Spark应用程序
- LeetCode143 Reorder List
- ClassNotFoundException :org.springframework.web.util.Log4jConfigServlet
- C++11之美
- iOS 6.0 Masonry自动布局表头/表尾时崩溃解决方案
- Android SurfaceView简介
- 关于成长的淡鸡汤
- mybatis实战教程之开发环境搭建、以接口的方式编程、实现数据的增删改查
- ComboTree( 树型下拉框) 组件
- 常见多线程与并发服务器设计方案举例