• 图论----基础知识


    1. 什么是图

    图论(graph theory) 是数学的一个分支,它以 图 为研究的对象。

    图论本身是应用数学的一部分,历史上图论曾经被很多数学家各自独立建立过。关于图论的最早文字记载最早出现在欧拉 1736 年的论著中,也就是著名的柯尼斯堡(Konigsberg)问题(七桥问题)。

    2. 图的定义

    一个图G是一个二元组,即序偶<V,E>,或记作G=<V,E> ,其中V是有限非空集合,称为G的顶点集,V中的元素称为顶点或结点;E称为 G的边的集合,所有的边ei都属于E,都有v中的结点与之对应,称ei为 G的边。

    3. 图的基本概念

    l  无向图:每条边都是无向边的图。

    l  有向图:每条边都是有向边的图。

    l  混合图:在一个图中,有些边是有向边,另一些边是无向边,则该图为混合图。

    l  有限图:一个图的点集和边集都是有穷集的图。

    零图:边集为空集的图。

    平凡图仅有一个结点而没有边构成的图。

    l  关联:若有ei=(u,v) 且ei属于E ,则称u是和v相关联的。

    l  孤立点:无边关联的点。

    l  自环:若一条边所关联的两个结点重合,则称此边为自环。

    l  邻接:关联于同一条边的两个点  和  称为邻接的;关联于同一个点的两条边  和  是邻接的(或相邻的)。

    l  路径:图G=(V,E)中,若存在顶点序列vi0, vi1, …, vin,使得(vi0, vi1),( vi1, vi2),…, (vin-1, vin)都在E 中(若是有向图,则使得<vi0, vi1>,< vi1, vi2>,…,<vin-1, vin>都在E中),则称从顶点vi0到vin存在一条路径。

    l  路径长度:路径上的边数。

    l  简单路径:若路径上的顶点除vi0和vin可以相同外,其它顶点都不相同。

    l 回路或环:起点和终点相同的简单路径。

    l 根:有向图中,若存在一顶点v,从该顶点有路径可以 到图中其它所有顶点,则称此有向图为有根图,v 称为图的根。

    l 完全图:若图中各个顶点都与除自身外的其他顶点有关系,这样的无向图称为完全图(如图 4a))。同时,满足此条件的有向图则称为有向完全图(图 4b))。

     

     具有 n 个顶点的完全图,图中边的数量为 n(n-1)/2;而对于具有 n 个顶点的有向完全图,图中弧的数量为 n(n-1)。

    l 稀疏图和稠密图:这两种图是相对存在的,即如果图中具有很少的边(或弧),此图就称为"稀疏图";反之,则称此图为"稠密图"。

    稀疏和稠密的判断条件是:e<nlogn,其中 e 表示图中边(或弧)的数量,n 表示图中顶点的数量。如果式子成立,则为稀疏图;反之为稠密图。

    无向图

    l 连通:无向图G=(V,E)中,若从vi到vj有一条路径 (从vj到vi也一定有一条路径),则称vi和vj是连通。

    l 连通图:若V(G)中任意两个不同的顶点vi和vj都是连通的(即有路径),则称G为连通图。

     

     

           连通图

    l 连通分量:无向图G中的最大连通子图称为G的连通分量。

    l 最大连通子图:任意增加结点或边以后得到的子图 均不连通。

    有向图

     l 强连通图:有向图G=(V,E)中,若V(G)中任意 两个不同的顶点vi和vj都存在从vi到vj以及从vj和vi 的路径,则称图G是强连通图。

     

                      强连通图

    l 强连通分量:有向图的最大强连通子图称为图的强连通分量 强连通图只有一个强连通分量,就是其自身 非强连通的有向图有多个强连通分量

    l 网络:若图的每条边都赋上一个权,则称为带权图 带权的连通图称为网络。

    4.两个定理:

    381.png

    如图中,边数为6,度数之和(3+3+3+3)

    推论:在任意图中,度数为奇数的点必然有偶数个。

    382.png

    推论:即所有点入度之和等于出度之和。

    (这个比较好理解,就如同问世界上的上坡多还是下坡多一样,答案是一样多)

    由上面的概念可知,树或者是森林,就是一种特殊的图。

    5.图的存储:

    邻接矩阵表示法

    邻接表表示法

    邻接多重表表示法

    图的十字链表等

    邻接矩阵表示法

    邻接矩阵是表示顶点间相邻关系的矩阵 设G=(V,E)为具有n个顶点的图,其邻接矩阵为 具有以下性质的n阶方阵

    邻接矩阵的英文名是 adjacency matrix。它的形式是 bool adj[n][n],这里面n是节点个数,adj[i][j]表示i和j之间是否有边。

    如果边有权值,也可以直接用 int adj[n][n] ,直接把边权存进去。

    它的优点是可以在O(1)时间内得到一条边是否存在,缺点是需要占用O(n^2)的空间。对于一个稀疏的图(边相对于点数的平方比较少)来说,用邻接矩阵来存储的话,成本偏高。

    其代码可以表示为(假设各边长度均为1):

    #include<iostream>
      
    using namespace std;
      
    const int maxn=105;
    int adj[maxn][maxn]={0};    //定义邻接矩阵
      
    int x,y;    //输入两条边
    int n,m;    //供输入n对边 ,m个顶点 (x,y <= m) 
      
    int main(){
        cin>>n>>m;
        for(int i=0;i<n;i++){
            cin>>x>>y;
            adj[x-1][y-1]=1;
            adj[y-1][x-1]=1;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){
                cout<<adj[i][j]<<' ';
            }
            cout<<endl;
        }
        return 0;
    }

    如果G是带权的图,wij是边(vi,vj)或< vi,vj>的权, 则其邻接矩阵定义为∶

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13637688.html

  • 相关阅读:
    phpMyAdmin cannot login to mysql server
    emulation 与 simulation 的区别
    C++类构造函数中的成员初始化
    KEY IDEA For Topology-based Analysis
    NOTES ON [Efficient and Cost-Effective Hybrid Congestion Control for HPC Interconnection Networks]
    Install Google Chrome On Ubuntu 14.04
    idea 远程debug调试
    癌细胞作用于身体
    应用高cpu高内存占用
    Jackson总结:常用注解、整合spring、自定义JsonSerializer
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13637688.html
Copyright © 2020-2023  润新知