单源最短路径Dijkdtra

这篇博客介绍了如何使用Dijkstra算法在无向网中求解从特定节点出发到其他所有节点的最短路径。代码示例展示了如何在C++中实现这一算法,包括初始化、主循环和路径更新过程。此外,还提供了读取图结构、计算最短路径和处理任务距离的函数。最后,程序接收任务次数和任务节点,输出两次任务之间的最短距离。
摘要由CSDN通过智能技术生成

将地图简化为一张无向网,

史东薇尔城是一号结点,每一次执行任务:当前的所在地——>史东薇尔城——>任务地点。

每次会告诉你:当前所在结点,任务地所在结点,求出每次任务最短需要跑多远。

典型的在v0=1号结点跑单源最短路径,答案是俩个D[]的和

普通大学生数据结构代码如下

#include<bits/stdc++.h>
using namespace std;
#define V 20 //最多20个节点
#define MAXINT 1000 //路径最大1000
int S[V];
int D[V];
int Path[V];
int w;

typedef struct {
    int vexs[V];//储存点
    int arcs[V][V];//储存邻接矩阵
    int vexnum,arcnum;
}Graph;

void Create(Graph *G)
{
    cin>>G->vexnum>>G->arcnum;//图的结点数和边数
    //for( int i=0;i<G->vexnum;++i)   cin>>G->vexs[i];  //依次输入点的信息
    for( int i=0;i<G->vexnum;++i)
    {
        for( int j=0;j<G->vexnum;++j)
		{
            G->arcs[i][j] = MAXINT;   //初始化邻接矩阵,边的权值 均置为极大值MAXINT
        }
    }
    
    for( int i=0;i<G->arcnum;++i)
    {
        int v1,v2,w; cin>>v1>>v2>>w;
        G->arcs[v1-1][v2-1]= w;
        G->arcs[v2-1][v1-1]= w;//无向网   边<v1,v2>,<v2,v1>的权值是w
    }
    
}
//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
void dij(Graph G,int v0)
{
//--------------初始化
    int n,v,i;
    n=G.vexnum;    //n为G中顶点的个数
    for( v=0;v<n;++v ) //对n个顶点依次初始化
    {
        S[v]=0;             //vi不在S集合
        D[v]=G.arcs[v0][v];  //将v0到vi的最短路径长度 初始化为弧上的权值
        
        if( D[v]<MAXINT ) Path[v]=v0;   //如果v0和vi之间有弧,则将v的前驱置为v0
        else Path[v]= -1;                 如果v0和vi之间没有弧,则将v的前驱置为-1
    }
    S[v0] = 1;//将v0加入S集
    D[v0] = 0;//源点到源点的距离是0
    
    
//-------------主循环
//1.每次从未标记的节点中选择出 的节D[]最小的点 ,标记,收录到S集
//2.查询刚加入节点A的临近节点B的距离D[B] ,
//若(D[A]+G.arcs[A][B])<节点B的距离,就更新节点B的距离和前面点是A
    for( int i=0;i<n;++i )
    {
        int min;
        min=MAXINT;
        for (w=0;w<n;++w)
            if( !S[w] && D[w]<min )
            { 
                v=w;
                min=D[w];
            }
        S[v]=1;
        
        for( w=0;w<n;++w )
            if( !S[w] && (D[v]+G.arcs[v][w]<D[w]) )
            {
                D[w]=D[v]+G.arcs[v][w];
                Path[w]=v;
            }       
    }

}
int main()
{
    Graph G;//定义结构体变量G
    Create(&G);//创建网G
    dij(G,0);//用迪杰斯特拉算法求最短路径
    //for (int i=1;i<G.vexnum;++i) 
       // cout<<G.vexs[0]<<G.vexs[i]<<D[i];//输出源点0到各点的最短路径
    int t;cin>>t;
    int h,k;
    while( t-- ) {
        cin>>h>>k;
        cout<<D[h-1]+D[k-1]<<"\n";
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值