zoukankan      html  css  js  c++  java
  • 迪杰斯特拉算法

    最近一直带两个考研学生的《数据结构》,正好讲到图这一章,顺便实现了一下迪杰斯特拉算法。

      1 #include"stdafx.h"
      2 #include <iostream>
      3 
      4 using namespace std;
      5 const int MAXSIZE = 10;
      6 const int INF = 99999;//当作最大值
      7 typedef struct VertexNode{
      8     int Index;//点的编号默认为从1开始
      9     char info;
     10 };
     11 
     12 typedef struct MGraph{
     13     int edges[MAXSIZE][MAXSIZE];
     14     VertexNode nodes[MAXSIZE];
     15     int n, e;
     16 };
     17 //构建一个用邻接矩阵存储的图
     18 void CreateMGraph(MGraph& g,int n,int e);
     19 //迪杰斯特拉算法求图的最短路径
     20 void DijkStra(MGraph& g, int v, int dist[], int path[]);
     21 //输出该最短路径
     22 void PrintRoad(int path[],int v);
     23 
     24 void main(void)
     25 {
     26     MGraph g;
     27     int dist[MAXSIZE];
     28     int path[MAXSIZE];
     29     CreateMGraph(g, 7, 12);
     30     DijkStra(g, 1, dist, path);
     31     PrintRoad(path, 7);
     32 }
     33 
     34 void CreateMGraph(MGraph& g, int n,int e)
     35 {
     36     g.n = n;
     37     g.e = e;
     38     int vertex1, vertex2;
     39     int value;
     40     for (int i = 1; i <= n; ++i)
     41     {
     42         g.nodes[i].Index = i;
     43     }
     44 
     45     for (int i = 1; i <= g.n; ++i)
     46     for (int j = 1; j <= g.n; ++j)
     47     {
     48         g.edges[i][j] = INF;
     49     }
     50     
     51     for (int j = 1; j <= e; j++)
     52     {
     53         cout << "请输入边的两个点,中间以空格隔开
    ";
     54         cin >> vertex1 >> vertex2;
     55         cout << "请输入该边的权值
    ";
     56         cin >> value;
     57         g.edges[vertex1][vertex2] = value;
     58     }
     59 }
     60 
     61 void DijkStra(MGraph& g, int v,int dist[], int path[])
     62 {
     63     int i, j, min, u;
     64     int visited[MAXSIZE];
     65     for (i = 1; i <= g.n; ++i)
     66     {
     67         if (g.edges[v][i] < INF)
     68         {
     69             dist[i] = g.edges[v][i];
     70             path[i] = v;
     71         }
     72         else
     73         {
     74             dist[i] = -1;
     75             path[i] = -1;
     76         }
     77 
     78         visited[i] = 0;
     79     }
     80     visited[v] = 1;
     81     for (i = 1; i <= g.n; ++i)
     82     {
     83         min = INF;
     84         for (j = 1; j <= g.n;++j)
     85         if (visited[j] == 0 && dist[j] < min)
     86         {
     87             min = dist[j];
     88             u = j;
     89         }
     90         visited[u] = 1;
     91         for (j = 1; j <= g.n; ++j)
     92         {
     93             if (visited[j] == 0 && dist[j] > g.edges[u][j] + dist[u])
     94             {
     95                 dist[j] = g.edges[u][j] + dist[u];
     96                 path[j] = u;
     97             }
     98         }
     99     }
    100 }
    101 
    102 void PrintRoad(int path[],int v)
    103 {
    104     int stack[MAXSIZE], top = -1;
    105     while (path[v]!= -1)
    106     {
    107         stack[++top] = v;
    108         v = path[v];
    109     }
    110     stack[++top] = v;
    111     while (top != -1)
    112     {
    113         cout << stack[top--] << " ";
    114     }
    115     cout << endl;
    116 }
  • 相关阅读:
    【C语言】中的版本规范(C89 C99等)
    【微机】计算机系统组成
    【微机】验证负数以补码存储程序 C语言
    katalon studio升级到6.3.3版本后如何生成测试报告
    使用Katalon Studio进行数据驱动测试的方法(转)
    katalon 参数化
    Katalon中的测试对象、用例和套件的命名规范
    转载kalaton故障处理
    Katalon Studio IE浏览器 不好用 无法录制
    Katalon Studio操作界面详细说明(转载)
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4956175.html
Copyright © 2011-2022 走看看