C++Dijkstra邻接表实现

#ifndef MAPIMPLEMENT_H_INCLUDED
#define MAPIMPLEMENT_H_INCLUDED
#include<iostream>
#include<new>
#define MaxVertexNum 100
#define INFINITY 65535
using namespace std;
typedef  struct  node{   /* 边表结点 */
    int AdjV;            /* 邻接点域 */
    struct  node  *Next;  /* 指向下一个邻接点的指针域 */
    int weight;  /*表示边上的权值*/
    /* 若要表示边上的权值信息,则应增加一个数据域Weight */
} EdgeNode;
typedef  char  VertexType;   /* 顶点用字符表示 */
typedef  struct  Vnode{      /* 顶点表结点 */
    VertexType  Vertex;      /* 顶点域 */
    EdgeNode  *FirstEdge; /* 边表头指针 */
} VertexNode;
//typedef VertexNode AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
typedef  struct{
    VertexNode  adjlist[MaxVertexNum];    /* 邻接表 */
    int  n, e;               /* 顶点数和边数 */
} ALGraph;  /*ALGraph是以邻接表方式存储的图类型 */
void CreateALGraph( ALGraph *G )
{
    int i, j, k, w;
    EdgeNode *edge;
    cout<< "请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;
    cin>>G->n>>G->e;
    cout<<"请输入顶点信息(输入格式为:顶点号<CR>:"<<endl;
    for ( i=0; i < G->n; i++ ) {   /* 建立有n个顶点的顶点表 */
        cin>>G->adjlist[i].Vertex;  /* 读入顶点信息 */
       G->adjlist[i].FirstEdge = NULL; /* 顶点的边表头指针设为空 */
    }
    cout<<"请输入边的信息(输入格式为: i, j, w <CR>):"<<endl;
    for ( k=0; k < G->e; k++ ){   /* 建立边表 */
       cin>>i>>j>>w; /* 读入边<vi,vj>的顶点对应序号*/
       edge = new EdgeNode; /* 生成新边结点edge */
       edge->AdjV = j;/* 邻接点序号为j */
       edge->weight = w;
       edge->Next = G->adjlist[i].FirstEdge;
       /* 将新边表结点edge插入到顶点vi的边表头部 */
       G->adjlist[i].FirstEdge = edge;
       /* 若是无向图,还要生成一个结点,用来表示边< vj, vi>  */
       edge = new EdgeNode;
       edge->AdjV = i;
       edge->Next = G->adjlist[j].FirstEdge;
       edge->weight = w;
       G->adjlist[j].FirstEdge = edge;
    }
}

void Dijkstra(int s,int k,ALGraph *G)
{
    int j, t ,p;
    int path[G->n];
    int dist[G->n];
    for(int i=0;i<G->n;i++)
        dist[i]=INFINITY;
    for(EdgeNode *w=G->adjlist[s].FirstEdge;w!=NULL;w=w->Next)
    {
        dist[w->AdjV]=w->weight;
    }//初始化各顶点到源点的距离
    dist[s]=0;
    for(int i=0;i<G->n;i++)
    {
        if(dist[i]==INFINITY)
            path[i]=-1;
        else
            path[i]=s;
    }
    path[s]=-2;
    bool collected[G->n]={0};
    while(1)
    {
        t=INT_MAX;
        j=-1;
        for(int i=0;i<G->n;i++)
        {
            if(collected[i]==false&&dist[i]<t)
            {
                t=dist[i];
                j=i;
            }
        }
        if(j==-1)
            break;
        collected[j]=true;
        for(EdgeNode *w=G->adjlist[j].FirstEdge;w!=NULL;w=w->Next)
        {
            p=w->AdjV;//邻接点的下标
            if(dist[p]>dist[j]+w->weight)
                dist[p]=dist[j]+w->weight;
            path[p]=j;
        }
    }
}

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/qq_37566910/article/details/78323539
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞