Dijikstra(单源最短路径)

来源:互联网 发布:广州多益网络怎么样 编辑:程序博客网 时间:2024/06/04 01:16

Dijikstra(单源最短路径)

求无向图中两点间的最短路径
时间复杂度O(N2)

代码

#include<stdio.h>#include<stdlib.h>#define max 100#define maxint 32767typedef struct Node{    int map[max][max];    //邻接表     int n;                //顶点数 }Adjacency_list;/*************table邻接表v0:源点 dist为个点距离v0最小路径path记录最短路径节点的上个点*************/ void dijikstra(Adjacency_list table,int *dist,int *path,int v0){    int i;    bool *visited = (bool *) malloc(sizeof(bool) * table.n);    //初始化     for(i = 0;i < table.n;i++)    {        if(table.map[v0][i] > 0)        {            dist[i] = table.map[v0][i];            path[i] = v0;        }        else        {            dist[i] = maxint;            path[i] = -1;        }        visited[i] = false;    }     dist[v0] = 0;    visited[v0] = true;    int j;    int min;    int u;    int temp;    for(i = 0;i < table.n - 1;i++)    {        min = maxint;                   //寻找未被加入路径的最短结点         for(j = 0;j < table.n;j++)        {            if(visited[j] == false && dist[j] < min)            {                min = dist[j];                u = j;            }        }        visited[u] = true;        for(j = 0;j < table.n;j++)           //更新dist路径         {            temp = dist[u] + table.map[u][j];            if(visited[j] == false && table.map[u][j] > 0 && dist[j] > temp )            {                dist[j] = temp;                path[j] = u;            }        }    }}int show(int v0,int n,int *path){    if(path[n] == v0)    {        printf("%d  ",n);         return 0;    }    else    {        show(v0,path[n],path);        printf("%d  ",n);     }}int main(){    int i;    int j;    int n;    int m;    int p,q,value;    int v0;    int vn;    scanf("%d%d",&n,&m);    int *dist = (int *) malloc(sizeof(int ) * n);    int *path = (int *)malloc(sizeof(int) * n);     Adjacency_list t;    t.n = n;    for(i = 0;i < n;i++)    {        for(j = 0;j < n;j++)        {            t.map[i][j] = 0;        }    }    for(i = 0;i < m;i++)    {        scanf("%d%d%d",&p,&q,&value);        t.map[p][q] = value;        t.map[q][p] = value;    }    scanf("%d",&v0);    dijikstra(t,dist,path,v0);    scanf("%d",&vn);    show(v0,vn,path);    printf("  %d",dist[vn]);    return 0;}
0 0