美文网首页
数据结构-图

数据结构-图

作者: harrytc | 来源:发表于2018-10-21 19:29 被阅读20次

邻接矩阵中的两个最短路径算法,Djkstra,Floyd

#include <stdio.h>
#define maxSize 100
#define INF 999
typedef struct
{
    int no;  //节点编号
}VertexType;

typedef struct
{
    int n,e; //顶点数 边数
    VertexType vex[maxSize];  //顶点
    int edges[maxSize][maxSize];  // 邻接矩阵
}Mgraph;

void Dijkstra (Mgraph * G, int v, int path[], int dist[])
{
    int set[maxSize];
    int min, i , j, u = 0;
    //初始化数组
    for (i = 0; i < G->n; ++i)
    {
        dist[i] = G->edges[v][i];
        set[i] = 0; // 初始化顶点全部不加入在最短路径
        if (dist[i] < INF)
            path[i] = v;  //vi的前一个顶点设置为v
        else
            path[i] = -1;
    }
    path[v] = -1; set[v] = 1;
    
    //关键步骤
    for (i = 0; i < G->n; ++i)
    {
        min = INF;
        for (j = 0; j < G->n; j++)  //将路径最短的加入到其中
            if (set[j] == 0 && dist[j]<min)
            {
                u = j;
                min = dist[j];
            }
        set[u] = 1;   //将u加入顶点中
        
        for (j = 0; j < G->n; ++j)
            if (set[j]==0 && dist[j]  > dist[u]+G->edges[u][j])
            {
                path[j] = u; // 将j的前一个顶点设置为u
                dist[j] = dist[u]  + G->edges[u][j];
            }
    }
    
}

void Floyd (Mgraph g, int path[][maxSize])
{
    int i, j , k;
    int A[maxSize][maxSize];
    for (i = 0; i < g.n; i++)
        for (j = 0; j < g.n; j++)
        {
            A[i][j] = g.edges[i][j];
            path[i][j] = -1;
        }
    
    for (k = 0; k < g.n; k++)
        for (i = 0; i < g.n; i++)
          for (j = 0; j < g.n; j++)
          {
              if (A[i][j] < A[i][k] + A[k][j])
              {
                  A[i][j] = A[i][k] + A[k][j];
                  path[i][j] = k;
              }
          }
}

以邻接表存储的两种遍历,深度优先遍历和广度优先遍历,类比于树的前序遍历和层次遍历,但还是有很多差别的


typedef struct ArcNode
{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;

typedef struct
{
    int data;
    ArcNode * firstarc;
}VNode;

typedef struct
{
    int n,e; //顶点数,边数
    VNode * adjlist[maxSize];  //邻接表
}AGraph;

void Visit(int v)
{
    
}

void DFS (AGraph * G, int v)  //深度搜索
{
    int visit[maxSize];
    for (int i = 0 ;i  < G->n; ++i) visit[i] = 0;
    
    visit[v] = 1;
    Visit(v);
    ArcNode * p;
    p = G->adjlist[v]->firstarc;
    while (p != NULL)
    {
        if (visit[p->adjvex] == 0)
            DFS(G, p->adjvex);
    }
    p = p->nextarc;
}

void BFS(AGraph G, int v, int visit[maxSize]) //广度搜索
{
    ArcNode * p;
    int j;
    int que[maxSize], front = 0, rear = 0;
    Visit(v);
    visit[v] = 1;   //访问v节点
    rear = (rear + 1) % maxSize;
    que[rear] = v;
    while (rear != front)
    {
        front = (front + 1) % maxSize;
        j = que[front];
        p = G.adjlist[j]->firstarc;
        while (p != NULL)
        {
            if (visit[p->adjvex] == 0)
            {
                Visit(p->adjvex);
                visit[p->adjvex] = 1;
                
                rear = (rear + 1) % maxSize;
                que[rear] = p->adjvex;
            }
            p = p->nextarc;
        }
    }
    
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

相关文章

  • 图表的数据返回格式

    柱状图、折线图、雷达图的数据结构 饼状图、圆环图、漏斗图、仪表盘的数据结构 地图的数据结构 散点图的数据结构 sc...

  • 14-图和图的存储

    图 如何理解图?前面我们学习了线性表,链表,树等基础数据结构,图这种数据结构就是它们的综合利用。我们都知道,图有边...

  • HashMap源码分析

    HashMap数据结构 HashMap数据结构.png HashMap继承图 HashMap-class.jpg ...

  • 有向无环图的数据结构和拓扑排序

    有向无环图的拓扑排序,首先定义有向图的存储数据结构,邻接链表Bag,实现Iterable接口。 定义有向图的数据结构:

  • OVS 源码分析整理

    OVS 核心代码 OVS 架构 OVS 主要的数据结构数据结构关系图主要的数据结构和数据结构的参数数据结构代码 d...

  • 数据结构之图

    数据结构之图 1. 简介 图结构也是一种非线性数据结构。生活中有很多图结构的例子,比如通信网络、交通网络、人际关系...

  • TensorFlow2简单入门-张量数据结构(Tensor)

    程序 = 数据结构+算法 TensorFlow程序 = 张量数据结构 + 计算图算法语言 TensorFlow中的...

  • 数据结构与算法基础

    思维导图 一、数据结构 1、数据结构基础 1.1、什么是数据结构? 数据结构:是相互之间存在一种或多种特定关系的数...

  • LeetCode刷题计划

    几个重要问题类型 排序 查找 字符串处理 图问题 组合问题 几何问题 数值问题 几种基本数据结构 线性数据结构 图...

  • Java核心类库—— 数据结构

    Java核心类库-------数据结构体系图 1.数据结构 2.栈 3.哈希表

网友评论

      本文标题:数据结构-图

      本文链接:https://www.haomeiwen.com/subject/ldqizftx.html