c/c++ Dijkstra算法实现

来源:互联网 发布:魔笛 知乎 编辑:程序博客网 时间:2024/05/17 07:23
#include<stdlib.h>#include<stdio.h>#include <iostream>#include<stack>#include<string.h>#define M 100#define N 100//结构体一个图typedef struct node{    int matrix[N][M];  //邻接矩阵    int n;            //顶点数    int e;            //边数}MGraph;//dist[i]记录v0到i的最短距离,path[i]记录最短路上v0到i的前一个顶点,v0是源顶点void Dijkstra(MGraph g,int *dist,int *path,int v0){    int i,j,k;    //动态开辟bool型de visited,来标记顶点    bool *visited=(bool*)malloc(sizeof(bool)*g.n);    //将dist和path初始化    for(i=0;i<g.n;i++)    {        //如果v0与i直接相连        if(i!=v0&&g.matrix[v0][i]>0)        {            dist[i]=g.matrix[v0][i];            path[i]=v0;        }        //如果不直接相邻,权值设为无穷大        else        {            dist[i]=INT_MAX;            path[i]=-1;        }        //初始化标记        visited[i]=false;    }    path[v0]=v0;    dist[v0]=0;    visited[v0]=true;    //开始循环更新    for(i=1;i<g.n;i++)    {        int min=INT_MAX;        int u;        //找未被标记的权值最小的点        for(j=0;j<g.n;j++)        {            if(visited[j]==false&&dist[j]<min)            {                min=dist[j];                u=j;            }        }        visited[u]=true;        printf("%d\n",u);        //更新dist的值和最短路径        for(k=0;k<g.n;k++)        {            if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]<dist[k])            {                dist[k]=min+g.matrix[u][k];                path[k]=u;            }        }    }}int main(){    //顶点数和边数,还有描述关系的语句个数m    int n,e,m;    MGraph g;    //表示存在一条边s->t,权值为w    int s,t,w;    //源顶点v0    int v0;    scanf("%d %d %d",&n,&e,&m);    //初始化二维数组为0    memset(g.matrix,0,sizeof(g.matrix));    g.n=n;    g.e=e;    //将二维数组填好    for(int i=0;i<m;i++)    {        scanf("%d %d %d",&s,&t,&w);        g.matrix[s][t]=w;        g.matrix[t][s]=g.matrix[s][t];    }    g.n=n;    g.e=e;    //输入源顶点    scanf("%d",&v0);    int *dist=(int *)malloc(sizeof(int)*n);    int *path=(int *)malloc(sizeof(int)*n);    Dijkstra(g,dist,path,v0);    return 0;}