图论_最短路问题

本文介绍单源最短路径问题中的Dijkstra算法,适用于无负权边的图。通过优先队列实现,逐步更新顶点距离,直至求得从源点到所有其他顶点的最短路径。

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

单源最短路之Dijkstra(迪杰斯特拉)算法

适用范围:没有负边
时间复杂度:O(|E|log|V|)
核心思想:
(1)找到最短距离已经确定的顶点中最短距离最小的顶点u,从它出发更新所有相邻顶点的距离
(2)然后就不需要关心u并重复(1)直到所有顶点的最短距离都确定了
/*题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 */

#include <queue>
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX_V 5050

using namespace std;

typedef struct node
{
    int dis;
    int num;
}P;
P a[MAX_V];
int V,E;
int cost[MAX_V][MAX_V];

bool operator<(const P &x,const P &y)
{
    return x.dis>y.dis;
}

int dijkt(int s)
{
   priority_queue<P> que;
   for(int i=1;i<=V;i++)
   {
       a[i].num=i;
       a[i].dis=INF;
   }
   a[s].dis=0;

   que.push(a[s]);
   while(!que.empty())
   {
       P tmp=que.top();
       que.pop();
       for(int i=1;i<=V;i++)
       {
           if(a[i].dis>tmp.dis+cost[tmp.num][i])
           {
               a[i].dis=tmp.dis+cost[tmp.num][i];
               que.push(a[i]);
           }
       }
   }
   return a[V].dis;
}

int main()
{
    while(scanf("%d%d",&V,&E))
    {

    if(V==0&&E==0)
        break;

    for(int i=1;i<=V;i++)
        for(int j=1;j<=V;j++)
        cost[i][j]=INF;
    for(int i=1;i<=E;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        cost[x][y]=cost[y][x]=z;
    }
    printf("%d\n",dijkt(1));
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值