Dijikstra(单源最短路径)
求无向图中两点间的最短路径
时间复杂度O(N2)
代码
#include<stdio.h>
#include<stdlib.h>
#define max 100
#define maxint 32767
typedef 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;
}