九度OJ108 HDOJ3790 最短路径问题 迪杰斯特拉算法

               

    浙大的这道考研上机题明摆着要使用最短路径算法,考虑时间复杂度,我用了迪杰斯特拉算法。

    这道题比书上的样例算法稍微有些复杂,不仅要求距离最短,而且要在同时有多个距离最短的情况下,要求费用也最短。这个处理的方法就是更新最短路径时考虑两种情况。HDOJ的测试数据里有重边,因此输入时要将保存最短的重边。

    我的AC代码:

#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;const int Max = 1000 + 10;int dist[Max][Max];int cost[Max][Max];int minDist[Max];int minCost[Max];const int Inf = 0x0fffffff;int n, m;void Dijkstra(int source)bool final[Max] = {false}; for(int i=1; i<=n; ++i)   minDist[i] = dist[source][i], minCost[i] = cost[source][i], final[i] = false; final[source] = truefor(int i=2; i<=n; ++i) {  int pos = 1, md = Inf, mc = Inf;  for(int j=1; j<=n; ++j)   if(!final[j] && ((minDist[j] < md) || (minDist[j] == md && minCost[j] < mc)))    md = minDist[j], pos = j, mc = minCost[j];  if(md == Inf) break;  final[pos] = true;  for(int j=1; j<=n; ++j)   if(!final[j] && ((minDist[pos] + dist[pos][j] < minDist[j]) || (minDist[pos] + dist[pos][j] == minDist[j] && minCost[pos] + cost[pos][j] < minCost[j])))    minDist[j] = minDist[pos] + dist[pos][j], minCost[j] = minCost[pos] + cost[pos][j]; }}int main()int a, b, c, d; int head, tail; while(scanf("%d %d", &n, &m) && !(!n && !m)) {  for(int i(0); i<Max; ++i)   for(int j(0); j<Max; ++j) dist[i][j] = cost[i][j] = Inf;  for(int i(0); i<m; ++i)  {   scanf("%d %d %d %d", &a, &b, &c, &d);   //判断重边   if(dist[a][b] > c || (dist[a][b] == c && cost[a][b] > d))   {    dist[a][b] = dist[b][a] = c;    cost[a][b] = cost[b][a] = d;   }  }  scanf("%d %d", &head, &tail);  Dijkstra(head);  printf("%d %d\n", minDist[tail], minCost[tail]); } system("pause"); return 0;}




           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值