C++ 图基础知识总结
来源:互联网 发布:windows官方商城 编辑:程序博客网 时间:2024/06/05 10:43
图的定义:
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中数据元素我们则称之为顶点(Vertex),图结构强调顶点集合V要有穷非空。图结构中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶(Vi,Vj)来表示。
例:
V1={A,B,C,D},
E1={(A,B),(B,C),(C,D),(D,A),(A,C)}
有向边:若从顶点Vi到Vj的边有方向,则称这条边为有向边,也成为弧(Arc),用有序偶<Vi,Vj>来表示,Vi称为弧尾,Vj称为弧头。
例:
V2={A,B,C,D},
E2={<B,A>,<B,C>,<C,A>,<A,D>}
简单图:在图结构中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n*(n-1)/2条边。
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的有向完全图有n*(n-1)条边。
稀疏图和稠密图:这里的稀疏和稠密是模糊的概念,都是相对而言的,通常认为边或弧数小于n*logn(n是顶点的个数)的图称为稀疏图,反之称为稠密图。
有些图的边或弧带有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight),带权的图通常称为网(Network)。
假设有两个图G1=(V1,E1)和G2=(V2,E2),如果V2⊆V1,E2⊆E1,则称G2为G1的子图(Subgraph)。
对于无向图G=(V,E),如果边(V1,V2)∈E,则称顶点V1和V2互为邻接点(Adjacent),即V1和V2相邻接。边(V1,V2)依附(incident)于顶点V1和V2,或者说边(V1,V2)与顶点V1和V2相关联。
顶点V的度(Degree)是和V相关联的边的数目,记为TD(V)
对于有向图G=(V,E),如果有<V1,V2>∈E,则称顶点V1邻接到顶点V2,顶点V2邻接自顶点V1。
以顶点V为头的弧的数目称为V的入度(InDegree),记为ID(V),以V为尾的弧的数目称为V的出度(OutDegree),记为OD(V),因此顶点V的度为TD(V)=ID(V)+OD(V)。
无向图G=(V,E)中从顶点V1到顶点V2的路径(Path),如果G是有向图,则路径也是有向的。
路径的长度是路径上的边或弧的数目。第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径,除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。
在无向图G中,如果从顶点V1到顶点V2有路径,则称V1和V2是连通的,如果对于图中任意两个顶点Vi和Vj都是连通的,则称G是连通图(ConnectedGraph)
无向图中的极大连通子图称为连通分量。
在有向图G中,如果对于每一对Vi到Vj都存在路径,则称G是强连通图。有向图中的极大强连通子图称为有向图的强连通分量。
所谓的一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。
如果一个有向图恰有一个顶点入度为0,其余顶点的入度均为1,则是一棵有向树。
邻接矩阵
int matrix[MAX_VERTEX][MAX_VERTEX]
邻接表
struct Side{int index;int weight;Side* next;}struct Vertex{char data;Side* first;}typedef Vertex AdjList[MAX_VERTEX];struct AdjGraphAdjList adjlist;int num_vertex;int num_side;}
十字链表
struct Side{int tail;int head;Side* head_next;Side* tail_next;}struct Vertex{char data;Side* in_first;Side* out_first;}typedef Vertex AdjList[MAX_VERTEX];struct AdjGraph{AdjList adjlist;int num_vertex;int num_side;}
邻接多重表
struct Side{int i;Side* i_next;int j;Side* j_next;}struct Vertex{char data;Side* first;}typedef Vertex AdjList[MAX_VERTEX];struct AdjGraph{AdjList adjlist;int num_vertex;int num_side;}
边集数组
char VertexList[MAX_VERTEX];struct Side{int begin;int end;int weight;}typedef Side SideList[MAX_SIDE];
- objective-c基础知识总结
- c语言基础知识总结
- C基础知识总结
- C语言基础知识总结
- C语言基础知识总结
- C语言基础知识总结
- C语言基础知识总结
- C/C++语言基础知识总结
- C语言基础知识 梳理总结
- C语言指针基础知识总结
- C/C++基础知识总结1
- C/C++基础知识总结2
- C/C++基础知识总结3
- C/C++基础知识总结4
- C语言基础知识 梳理总结
- C/C++基础知识总结<一>
- C语言基础知识梳理总结
- C语言基础知识 梳理总结
- 通过阿里云发布一个Tomcat,并通过域名访问
- 相邻素数对(质数筛选)
- 牛顿迭代式(Newton's Method)解多次方程
- 使用Amazon EC2及OpenVPN搭建属于自己的免费VPN服务器
- ubuntu16.04安装配置mod_python,apxs,apache
- C++ 图基础知识总结
- 自定义Veiw的实践(一)---一个简易侧滑菜单的实现
- hdu 2602 Bone Collector
- Codeforces 469D Two Sets【思维+并查集】
- PAT 1003 乙等 (我要通过) c++
- trunk函数详解
- 求数组中的次大值
- 数位DP-要49-基础DP-hdu3555-四种方法
- MyBatis架构设计及源代码分析(一):MyBatis架构