/**
* 图:G(V,E) V顶点,E边 有向边<a,d> 无向边(a,d)
* 无向完全图:任意2个顶点之间都存在边。共(n*(n-1) / 2)条边
* 有向完全图:任意2个顶点之间都存在方向互为相反的2条弧。 共 n*(n-1)条边
* 权:图中边带数字的
* 度:相邻边的数目。边数=每个顶点度的和*2 。
* 无向图的度:TD(V)
* 有向图的度:入度ID(V)=出度OD(V) TD(V)=ID(V)+OD(V)
* 连通分量:是一个图的子图;且是连通的;含有极大顶点数;具有极大顶点数的连通子图包含依附于这些顶点的所有边
* 连通图的生成树:n个结点,n-1条边
* 有向树:有向图中一顶点入度为0,其余顶点入度为1
*/
图存储结构
/**
* 邻接矩阵:一个一维数组存图中顶点信息,一个二维数组存图中的边或弧的信息
* 图 a
* b c
* d
*如:{"A","B","C","D"};s={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
* s[0][1]=0 A和B之间没有边;=1 有边
* s[0][x]的和为A的度;其中为1的是邻结点
*
* 邻接表:一个一维数组存图中顶点信息,顶点信息包含data和firstEdge,firstEdge(adjvex、next)指向边
* 0 a|FE FE->[1|N] N->[2|N] ...
* 1 b|FE ...
* 2 c|FE ...
*
* 对有向图而言,邻接表是有缺点的。关系出度,入度麻烦
*
* 十字链表:邻接表和逆邻接表整合在一起 有向图的优化存储结构
* VertexNode[data|firstIn|firstOut]
* EdgeNode[tailIdx|headIdx|headLink|tailLink]
* v0(tail)->v3(head) firstOut->EdgeNode(v3) tailIdx=0,headIdx=3 headLink|tailLink 都是空
* v1->v0,v2->v0 v0的firstIn->EdgeNode(v1) tailIdx=1,headIdx=0 headLink->EdgeNode(v2) tailLink
*
*
* 邻接多重表:适用对已访问的表作标记/删除某条边 无向图的优化存储结构
* EdgeNode[ivex|ilink|jvex|jlink] 边
* ivex和jvex:是边的两个顶点在顶点表中的下标
* ilink和jlink:依附于顶点ivex或jvex的下一条边
* 顶点 边
* ivex ilink jvex jlink
* v0 0 1
* v1 1 2
* v2 2 3
* v3 3 0
* 0 2
* 01边是v0的第一条边;它的另一条边是30,所以ilink->30;30中的jvex=0,v0的第三条边,jlink->02
*
* 边集数组:2个一维数组。一个存储顶点信息;一个存储边信息
* EdgeNode[begin|end|weight]
* 起点下标|终点下标|权值
*/