【图算法】Dijkstra算法及变形

图示:

模版:

  1 /*
  2 Dijkstra计算单源最短路径,并记录路径
  3
  4 m个点,n条边,每条边上的权值非负,求起点st到终点et的最短路径
  5
  6 input:
  7 n m st et
  8 6 10 1 6
  9 1 2 6
 10 1 3 2
 11 1 4 1
 12 2 3 6
 13 2 5 3
 14 3 4 2
 15 3 5 2
 16 3 6 4
 17 4 6 5
 18 5 6 3
 19
 20 output:
 21 6
 22 1-->4-->6
 23 */
 24
 25
 26
 27 #include<iostream>
 28 #include<stdio.h>
 29 #include<cstring>
 30 using namespace std;
 31
 32 #define INF 0xfffffff
 33 #define MAXN 1010
 34
 35 int n,m;                    /*n:点数,m:边数*/
 36 int st,et;                    /*st:起点,et:终点*/
 37 int  weight[MAXN][MAXN];    /*保存的是边权值*/
 38 int  dis[MAXN];                /*保存源点到任意点之间的最短路*/
 39 int  father[MAXN];            /*保存i点的父亲节点*/
 40 int  vis[MAXN];                /*记录哪些顶点已经求过最短路*/
 41
 42
 43 void input()
 44 {
 45     scanf("%d%d%d%d",&n,&m,&st,&et);
 46     int i,j;
 47     for(i=1;i<=n;i++)
 48     {
 49         for(j=1;j<=n;j++)
 50             weight[i][j]=INF;
 51         weight[i][i]=0;
 52     }
 53     int start,end,value;
 54     for(i=0;i<m;i++)
 55     {
 56         scanf("%d%d%d",&start,&end,&value);
 57         if(weight[start][end]>value)                        //去重
 58             weight[start][end]=weight[end][start]=value;    //无向图
 59     }
 60 }
 61
 62 void dijkstra()
 63 {
 64     int i,j;
 65     memset(vis,0,sizeof(vis));
 66     memset(father,0,sizeof(father));
 67
 68     //初始化dis数组
 69     for(i=1;i<=n;i++)
 70         dis[i]=INF;
 71     dis[st]=0;
 72
 73     //枚举n个点
 74     for(i=1;i<=n;i++)
 75     {
 76         int pos=-1;
 77
 78         //找到未加入集合的最短路的点
 79         for(j=1;j<=n;j++)
 80             if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
 81                 pos=j;
 82
 83         //标记这个点已经走过
 84         vis[pos]=1;
 85
 86         //更新dis
 87         for(j=1;j<=n;j++)
 88             if(!vis[j]&&(dis[j]>dis[pos]+weight[pos][j]))
 89             {
 90                 dis[j]=dis[pos]+weight[pos][j];
 91                 father[j]=pos;
 92             }
 93     }
 94 }
 95
 96 void output()
 97 {
 98     printf("%d\n",dis[et]);
 99     int que[MAXN];
100     int cnt=0;
101     int tmp=et;
102     while(father[tmp]!=0)
103     {
104         que[cnt++]=tmp;
105         tmp=father[tmp];
106     }
107     int i;
108     printf("%d",st);
109     for(i=cnt-1;i>=0;i--)
110         printf("-->%d",que[i]);
111     printf("\n");
112 }
113
114
115 int main()
116 {
117     input();
118     dijkstra();
119     output();
120     return 0;
121 }


变形1:PAT 1018:http://pat.zju.edu.cn/contests/pat-a-practise/1018

时间: 2024-10-08 22:16:23

【图算法】Dijkstra算法及变形的相关文章

Dijkstra算法与堆(C++)

Dijkstra算法用于解决单源最短路径问题,通过逐个收录顶点来确保已收录顶点的路径长度为最短.      图片来自陈越姥姥的数据结构课程:https://mooc.study.163.com/learn/1000033001?tid=1000044001#/learn/content?type=detail&id=1000112011&cid=1000126096 Dijkstra算法的时间复杂度,取决于“V=未收录顶点中dist最小者”的算法.这一步可以用线性查找实现,也可以用最小堆实

Dijkstra算法(求解单源最短路)详解 + 变形 之 poj 1860 Currency Exchange

/* 求解单源最短路问题:Dijkstra算法(该图所有边的权值非负) 关键(贪心): (1)找到最短距离已经确定的节点,从它出发更新与其相邻节点的最短距离: (2)此后不再关心(1)中“最短距离已经确定的节点”. 时间复杂度(大概的分析,不准确): “找到最短距离已经确定的节点” => O(|V|) "从它出发更新与其相邻节点的最短距离" => 邻接矩阵:O(|V|),邻接表:O(|E|) 需要循环以上两个步骤V次,所以时间复杂度:O(V^2) 即:在|E|较小的情况下,

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一.前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离.消耗.费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离.比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的.现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小.有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是考虑到费用的高昂,这条线路甚至还不如上海到北京的高铁可取.更有甚者,假设国家开通了从上海到西藏,再从西藏到兰州

hdu 2851 dijkstra算法变形

dijkstra算法模板: Int visited[i]//结点i若被访问则为1,没有则为0 Int dist[i]// 目前结点j到其他各结点的最短路的长度 Int w[i][j]//边(i,j)的权值 初始化:(结点1~n) memset(v,0,sizeof(v)); dist[j]=0; dist[i]=inf;(i>=1&&i<=n&&i!=j) cin>>a>>b>>x; if(w[a][b]>x)//a到b

最短路径问题的Dijkstra算法

问题 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树>    .该算法常用于路由算法或者作为其他图算法的一个子模块. 这个算法的python实现途径很多,网上能够发现不少.这里推荐一个我在网上看到的,本来打算自己写,看了这个,决定自己不写了,因为他的已经太好了. 以下代码来自网络,但是我不能写来源,因为写了来源网址,这里就不让我发出这篇文章.这不是逼着我剽窃吗? 解决(Python) #!/usr/bin

POJ 2253 Frogger (dijkstra算法 + 预处理)

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27020   Accepted: 8797 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM: HDU 3790 最短路径问题-Dijkstra算法

HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是