hdu3790最短路径

本文介绍了一个使用Dijkstra算法解决带权图中单源最短路径问题的C++实现。通过初始化距离矩阵并采用贪心策略逐步更新顶点的距离与经过边的权重,找到从起点到所有其他顶点的最短路径及最小代价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int M = 1005;
const int MAX = 0x7fffffff;
int dp[M][M];
int cont[M][M];
int vist[M];
int dir[M];
int value[M];
int n, m;

void init() {


    for(int i = 1; i <= n; i++) {

        for(int j = 1; j <= n; j++) {

            dp[i][j] = MAX;
            cont[i][j] = MAX;
        }
    }
}

void  dijkstra(int u) {

    int index;

  for(int i = 1; i <= n; i++) {

    dir[i] = dp[u][i];
    value[i] = cont[u][i];
    vist[i] = 0;
  }


  vist[u] = 1;
  dir[u] = 0;
  value [u] = 0;
  for(int i = 1; i <= n; i++) {

    int minn = MAX;
    for(int j = 1; j <= n; j++) {

        if(!vist[j] && dir[j] < minn)
        {
            minn = dir[j];
            index = j;
        }
    }
        if(minn == MAX)
            break;
        vist[index] = 1;
        for(int k = 1; k <= n; k++) {
           if(!vist[k] &&dp[index][k] < MAX ) {

            if(dir[k] > dir[index] + dp[index][k])
            {
                dir[k] = dir[index] + dp[index][k];
                    value[k] = value[index] + cont[index][k];
            }
            else if(dir[k] == dir[index] + dp[index][k])
            {
                 if(value[k] > value[index] + cont[index][k])
                {
                    value[k] = value[index] + cont[index][k];
                }
            }
           }
        }
  }

}
int main()
{
    int a, b, c, d;
    int s, e;
    while(scanf("%d%d", &n, &m) != EOF) {
          if(n == 0 && m == 0)
            break;
        init();

        for(int i = 1; i <= m; i++) {

            scanf("%d%d%d%d", &a, &b, &c, &d);
            if(dp[a][b] > c) {

                dp[a][b] = dp[b][a] = c;
                cont[a][b] = cont[b][a] = d;
            }
            else if(dp[a][b] == c) {

                if(cont[a][b] > d) {
                   cont[a][b] = cont[b][a] = d;
                }
            }

        }
        scanf("%d%d", &s, &e);

        dijkstra(s);
        printf("%d %d\n", dir[e], value[e]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值