zoukankan      html  css  js  c++  java
  • 图论:图的表示

    图论

    序言:很高兴你能在电脑前点开这篇博客,因为它的作者ssw02为了遵守约定,也有了他可以为之付出的喜欢的人,开始了朝6晚12的生活,从而将更加优质的博客带给各位。

    • 图算法作为一种下至NOIP,上到IOI,ACM的重要算法,已经发展出了许多分支,这不仅导致各大算法竞赛中出现了更多图论的变种题,而且对图的理解和运用也越来越灵活。所以,掌握和灵活运用图论算法,是每个OIer都必须掌握的。

    图的表示

    存图,通常采用邻接链表邻接矩阵,二者各有优劣,下面将对这二者进行讲解。当然,存图不局限于上二者,但OI,一定要考虑实用性。

    邻接链表

    在SPFA,Dijkstra,树形Dp,网络流 等算法中常会用到的存图方式,拥有链表式结构,通常我们称其为链式前向星。

    int  tot = 1 , head[ N ] , to[ M ], nex[ M ] ;
    void  add( int  x , int  y  ){
        to[ ++tot ] = y  , nex[ tot ] = head[ x ] , head[ x ] = tot;
    }
    mian中
        for( register int i = 1 ; i <= M ; i++ ){
    	     int  m1 = read() , m2 = read()  ;
    		 add( m1 , m2 ) ; //add( m2 , m1 ) ;
        }
    

    优点
    1.O(V+E)的空间数量级,没有空间的浪费(毕竟是一维存储)
    2.无论是有向图还是无向图,都十分适用,即使是在混合有有向边和无向边的图中,链式结构也可以得心应手。
    3.可修改性强,可以维护并存储一些特定的值(扩展在下面)

    缺点
    无法快速查找一条边是否在图中,具体而言,就是对一条边(u,v)的查询,我们需要付出从head[u]开始,直到在长链表中查到v的一个代价,期望代价是不能让人接受的,尤其是在稠密图的情况下,效率明显低下。(这里给了我们一种卡掉一些没有优化的最短路算法的启示,稠密图会使最短路算法SPFA的复杂度明显上升)。

    邻接矩阵

    bool A[ N ][ N ] ;
    mian中
       for( register int i = 1 ; i <= M ; i++ ){
            int m1 = read() , m2 = read() ;
    		A[ m1 ][ m2 ] = true ;
    		//无向边 A[ m2 ][ m1 ] = true ;
       }
    

    优点
    1.在稠密图中的表现很好,而且支持快速查询边上信息。
    2.可以快速查找一条边是否在图中 O(1) 。
    3.很好写。

    缺点
    快速查找是以牺牲空间为代价,我们在维护一个 N^2 大小的二维数组时,浪费了太多无用的空间,在稀疏图中的实用价值太小。

    扩展

    邻接链表,扩展是因题而异的,就像最短路算法中我们记录的边权,就是一种扩展。再举个例子,在混合有最小生成树或者离线的一些最短路中,我们也可以多记录一个from来记录这条边的出发节点,这样在使用时会非常方便。
    邻接矩阵,有向无向或者混合可以考虑点对(xi,yj),( xj,yi )。当然,记录更多的信息只要再多开一个矩阵对应,或者STL实现即可。

    这个扩展,最终都是因题而异,具体只有各位在实践中摸索,这毕竟只是个技巧,我们应当在总结技巧的同时,把更多的精力投入算法的灵活运用中。

    非常感谢你能耐心读完本篇博客,由于ssw02实力有限,如有错误和描述不清,还请各位大佬指出。

  • 相关阅读:
    支持向量机(二)
    kafka partiton迁移方法与原理
    park和unpark
    Replicated State Machine和WAL
    thrift源码分析
    thrift使用和源码分析
    kafka源码环境搭建
    kafka指定partiton生产
    gradle构建scala
    kafka consumer代码梳理
  • 原文地址:https://www.cnblogs.com/ssw02/p/11180084.html
Copyright © 2011-2022 走看看