#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MaxSize 100
#define INF 1000001
typedef struct EageTable
{
int node,len;
struct EageTable *next;
}EageTable;
typedef struct HeadTable
{
int node;
EageTable *first;
}HeadTable,HeadList[MaxSize];
typedef struct
{
HeadList List;
int nodeNum,arcNum;
}Graph;
int dis[MaxSize];//记录距离
bool vis[MaxSize] = {false};//记录是否访问过
void InitGraph(Graph *G);
void CreateGraph(Graph *G,int flag,int a,int b,int len);
void Dijkstra(Graph *G,int start);
/*初始化图*/
void InitGraph(Graph *G)
{
int i = 0;
for(;i < MaxSize;i++)
{
G->List[i].node = i;
G->List[i].first = NULL;
}
}
/*创建邻接表*/
void CreateGraph(Graph *G,int flag,int a,int b,int len)
{
EageTable *E;
E = (EageTable*)malloc(sizeof(EageTable));
E->node = b;
E->len = len;
//头插入创建邻接表
E->next = G->List[a].first;
G->List[a].first = E;
if(flag == 2)
{//无向图
EageTable *EI;
EI = (EageTable*)malloc(sizeof(EageTable));
EI->node = a;
EI->len = len;
EI->next = G->List[b].first;
G->List[b].first = E;
}
}
/*迪杰斯特拉算法*/
void Dijkstra(Graph *G,int start)
{
dis[start] = 0;//自己到自己为0
int i,j;
for(i = 0;i < G->nodeNum;i++)
{
int u = -1,min = INF;
for(j = 0;j < G->nodeNum;j++)//查找距离集合最短的点
if(vis[j] == false && dis[j] < min)
{//查找
u = j;
min = dis[j];
}
if(u == -1)return;//没有可继续遍历的点
vis[u] = true;
EageTable *E = G->List[u].first;
while(E)
{//遍历找出目前能到每个节点的最小值
if(vis[E->node] == false && dis[u] + E->len < dis[E->node])
dis[E->node] = dis[u] + E->len;
E = E->next;
}
}
}
int main(int argc, char const *argv[]) {
Graph G;
int i,flag,start;
InitGraph(&G);
printf("有向图-1 | 无向图-2:");
scanf("%d",&flag);
printf("请输入节点个数和边数:");
scanf("%d%d",&G.nodeNum,&G.arcNum);
printf("请输入%d条边:\n",G.arcNum);
for(i = 0;i < G.arcNum;i++)
{
int a,b,len;
scanf("%d%d%d",&a,&b,&len);
CreateGraph(&G,flag,a,b,len);
}
memset(dis,INF,sizeof(int)*MaxSize);
printf("请输入起始节点:");
scanf("%d",&start);
Dijkstra(&G,start);
printf("各点最短路径是:");
for(i = 0;i < G.nodeNum;i++)
printf("%-2d",dis[i]);
return 0;
}
// 0 1 1
// 0 3 4
// 0 4 4
// 1 3 2
// 2 5 1
// 3 2 2
// 3 4 3
// 4 5 3
王道考研 ++++ Dijkstra 迪杰斯特拉算法
猜你喜欢
转载自blog.csdn.net/WX_1218639030/article/details/99547269
今日推荐
周排行