图的学习

定义

点用边连接起来就是图,严格的讲,图是一种数据结构,定义为graph = (V,E),V是一个有限非空集合,代表定点,E是边的集合

概念

1节点的度:无向图中与节点相连接的边的数目,叫节点的度 2节点的入度:在有向图中,以这个节点为终点的有向边的数目 3节点的出度:以该节点为起点的有向边的数目 4权值:边的费用 5:连通:若图中节点U,V之间存在一条从U通过若干条边、点之后到达V的通路,则称U、V是连通的 8:回路:起点和终点相同的路径,称为回路or环 9.完全图:一个n阶的完全无向图含有n(n-1)/2条边;一个n阶的完全有向图含有n(n-1)条边 10.强连通分量:有向图中任意两点都连通的最大子图。特别地,单个点也算强连通分量

表示方法

1.二维数组邻接矩阵表示: int G[101][101]; G[i][j]表示i到j的边的权值,有如下定义:

G[i][j]当其值为1or权值时,i到j连通 G[i][j]为0或$\infty$时,i、j不连通 全是废话,你自己懂的

2数组模拟邻接表存储(其实和数组储存树差不多)

struct graph{
    int next,to,dis;
}G[5000};

然后老套路

图的遍历:

1广度优先dfs//个人认为有向无环图不需要判断visited,但是有向或有环的话必须 2.宽度优先bfs(基本不用,麻烦得一批)复杂度O(m+n)很短了

一笔画问题(欧拉回路)不重复走过所有路径的回路

俩定理(图论还是小学奥数?人性堕落还是道德沦陷?鬼知道)

1.存在欧拉回路的调价:图是连通的,有且仅有2个奇点 2.存在欧拉回路的调价:图是联通的,存在0个奇点 注意G[i][j]=G[j][i] = Unreachable 对应两个点访问过就标记不可达,否则StackOverflowError

哈密尔顿环

不重复走过所有路径,并能回到原点的回路