王道考研 ++++ Dijkstra 迪杰斯特拉算法

#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

发布了85 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/WX_1218639030/article/details/99547269