标签:dijkstra算法 单源最短路径
摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除。
链接算法过程
/*
有向图的构建及最短路径求解(Dijkstra)
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 30
#define MAX_INT 1000
typedef int VrType;
typedef char VtType;
bool visted[MAX_VERTEX_NUM]; //搜索时的标记矩阵
typedef struct ARC //用于表征图的连接关系
{
VrType adj; //连接关系
ARC *info; //附加信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct //定义图的完整结构
{
VtType vertex[MAX_VERTEX_NUM]; //顶点
AdjMatrix arcs; //邻接矩阵
int vertexnum,arcnum; //弧线和顶点的数目
}MGraph;
typedef struct node //FIFO链表(队列)
{
int vid;
struct node* next;
}Queue;
Queue* head=NULL;
void CreateG(MGraph &G) //创建图
{
int i,j;
printf("Construct the Graph...\n");
G.vertexnum=5;
G.arcnum=7;
for(i=0;i<MAX_VERTEX_NUM;i++) //邻接矩阵的初始化
{
for(j=0;j<MAX_VERTEX_NUM;j++)
{
if(i==j)
{
G.arcs[i][j].adj=0;
G.arcs[i][j].info=NULL;
}
else
{
G.arcs[i][j].adj=MAX_INT;
G.arcs[i][j].info=NULL;
}
}
}
G.vertex[0]=‘1‘; //顶点赋值
G.vertex[1]=‘2‘;
G.vertex[2]=‘3‘;
G.vertex[3]=‘4‘;
G.vertex[4]=‘5‘;
G.arcs[0][1].adj=10; //邻接矩阵赋值
G.arcs[0][1].info=NULL;
G.arcs[1][2].adj=50;
G.arcs[1][2].info=NULL;
G.arcs[0][3].adj=30;
G.arcs[0][3].info=NULL;
G.arcs[0][4].adj=100;
G.arcs[0][4].info=NULL;
G.arcs[2][4].adj=10;
G.arcs[2][4].info=NULL;
G.arcs[3][2].adj=20;
G.arcs[3][2].info=NULL;
G.arcs[3][4].adj=60;
G.arcs[3][4].info=NULL;
printf("Construction of Graph OK!\n\n");
return;
}
void ShowAdjMat(MGraph G) //邻接矩阵的显示
{
int i,j;
printf("The adjacent matrix is:\n");
for(i=0;i<G.vertexnum;i++)
{
for(j=0;j<G.vertexnum;j++)
{
printf("%d\t",G.arcs[i][j].adj);
}
printf("\n");
}
printf("\n");
return;
}
void addnode(Queue* head,int v) //链表添加新节点
{
Queue* temp,*newnode;
if(head==NULL)
{
head=(Queue*)malloc(sizeof(Queue));
head->next=NULL;
head->vid=v;
}
else
{
temp=head;
while(temp->next!=NULL)
{
temp=temp->next;
}
newnode=(Queue*)malloc(sizeof(Queue));
newnode->next=NULL;
newnode->vid=v;
}
return;
}
int sum(int flag[],int n)
{
int s=0;
for(int i=0;i<n;i++)
{
s+=flag[i];
}
return s;
}
void Dijkstra(MGraph G,VtType ch)
{
int* dis=(int*)malloc(sizeof(int)*G.vertexnum);
int* flag=(int*)malloc(sizeof(int)*G.vertexnum);
for(int i=0;i<G.vertexnum;i++)
{
if(G.vertex[i]==ch)
{
flag[i]=1;
for(int j=0;j<G.vertexnum;j++)
{
dis[j]=G.arcs[i][j].adj;
}
break;
}
}
while(sum(flag,G.vertexnum)!=G.vertexnum)
{
int i=0;
int min=MAX_INT;
int next=-1;
for(i=0;i<G.vertexnum;i++)
{
if(flag[i]!=1)
{
if(dis[i]<min)
{
min=dis[i];
next=i;
}
}
}
//新加入节点做标记
flag[next]=1;
//更新最近距离
/******************* 算法的核心所在 ******************/
for(i=0;i<G.vertexnum;i++)
{
if(dis[next]+G.arcs[next][i].adj<dis[i])
{
dis[i]=dis[next]+G.arcs[next][i].adj;
}
}
/*****************************************************/
}
printf("The min distance between node \‘%c\‘ and others are:\n",ch);
for(i=0;i<G.vertexnum;i++)
{
printf("%d\t",dis[i]);
}
}
int main(void)
{
MGraph G;
CreateG(G);
ShowAdjMat(G);
Dijkstra(G,‘1‘);
printf("\n\n");
system("pause");
return 0;
}
Dijkstra算法求最短路径,布布扣,bubuko.com
标签:dijkstra算法 单源最短路径
原文地址:http://blog.csdn.net/cjc211322/article/details/24932691