博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图 -数据结构(C语言实现)
阅读量:5138 次
发布时间:2019-06-13

本文共 2441 字,大约阅读时间需要 8 分钟。

读数据结构与算法分析

坑!待填!

若干定义

  • 一个图G = (V , E)由顶点集V和边集E组成,每条边就是一个点对

  • 如果点对是有序的,那么就叫做有向图

  • 边可能还具有第三种成分,权值

  • 无向图种从每个顶点到其他每个顶点都存在至少一天路径,则称为图是连通的。具有这样性质的有向图称为强连通,如果不是强连通的,但它的基础图是连通的,则称为弱连通

图的表示

领接矩阵

- 使用一个二维数组表示- 对于每条边(u,v),置A[u][v] = 1;

邻接表

- 用一个表来储存这个顶点的所有邻接点- 使用一个数组保存头单元- 每个头单元连接着所有顶点

拓扑排序

对有向无圈的顶点的一种排序,使得如果存在从vi到vj,那么在排序中vj必须出现在vi后面

实现

简单实现

  1. 从有向图中选取一个没有前驱(入度为0)的顶点,并输出之;
  2. 从有向图中删去此顶点以及所有以它为尾的弧(弧头顶点的入度减1);
  3. 重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

类型声明
typedef char VertexType ;typedef struct OutNode *Degree ;typedef struct GVertex *Vertex ;struct OutNode{    VertexType Date ;    Degree Next ;}struct GVertex{    int in ;    VertexType Date ;    Degree First ;}

主函数
int Getin(Vertex G){    int len = 0;    while((G++)->Data != '/0')        len ++ ;    return len ;}void TopSort(Vertex G){    int i,j,k ;    Degree P;    int VertexNum ;    VertexNum = Getin(G) ;    for(i = 0; i < VertexNum; i++)        for(j = 0;j < VertexNum; j++)            if(G[j].in === 0)            {                printf("%c ", G[j].data);                G[j].in = -1;                P = G[j].first ;                while(P != NULL)                {                    for( k=0; k
data == G[k].data ) { G[k].in--; break; } P = P->next; } break ; }}

无权单源最短路算法

基本思路:按照BFS的思路搜索图,并记下路径长

void Unweihted(Table T){    int CurrDist ;    Vertex V, W ;        for(Currist = 0; Currist < NumVertex; Currist++)        for each vertex V            if(!T[v].Known && T[v].Dist == Currist)            {                T[v].Known = True ;                for each W adjacent to V                    if(T[W].Dist == Infinity)                    {                        T[W].Dist = CurrDist + 1 ;                        T[W].Path = V ;                    }            }}

更高效率的

void Unweighted(Table T){    Queue Q ;    Vertex V, W ;        Q = CreateQueue(NumVertex) ;    MakeEmpty(Q) ;        while(!IsEmpty(Q))    {        V = Dequeue(Q) ;        T[V].Known = True ;                for each W adjacent to V            if(T[W].Dist == Infinity)            {                T[W].Dist == T[W].Dist + 1;                T[W].Path = V ;                Enqueue(W,Q) ;            }    }    DisposeQueue(Q) ;}

DFS深度优先搜索模板

`void dfs(Vertex V) { Visited[V] = True ; for each W adjacent to V if(!Visted[W]) dfs(W) ; }

转载于:https://www.cnblogs.com/secoding/p/9609363.html

你可能感兴趣的文章
【自制插件】MMD4Maya
查看>>
解决linux服务器乱码
查看>>
mapbox.gl文字标注算法基本介绍
查看>>
【C++】异常简述(二):C++的异常处理机制
查看>>
web.config在哪里
查看>>
SQL Server 2000 版本支持的最大物理内存量
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
Redis 常用数据结构命令
查看>>
软件工程课堂作业
查看>>
OpenFire 的安装和配置
查看>>
web.config详解
查看>>
ZJOI2018游记Round1
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
react-router v4 按需加载的配置方法
查看>>
函数指针
查看>>
【转】从头到尾彻底理解KMP
查看>>