图论的简单知识结构

本文出自:Svitter的Blog 以及 Github

图论Graph

8/8/2014 9:23:16 AM

图的基本概念

图的定义
Defination

  • 图是由顶点集合(Vertex)及顶点间的关系集合(边Edge)组成的一种数据结构: > Graph=( V, E )
  • 顶点Vertex

    V = {x | x ∈ 某个数据对象}

  • 边的集合Edge

    E = {(x, y) | x,y ∈ V }

    E = {(x, y) | x, y ∈ V && path(x,y)

  • Path(x, y)表示从x到y的一条单向通路——说明什么?<!--(有方向)-->
  • 由此我们可以得出

有向图
&& 无向图 ||( Directed graph && Oriented graph)

  • 在有向图中,顶点对是有序的。
  • 在无向图中,顶点对( x, y )是无序的。

完全图
Complete graph

  • 有n个顶点的无向图有n(n-1)/2条边,则此图为无向完全图(为什么?)<!--除了他本身,可以到达具有任何一个顶点的边 -->
  • 有n个顶点的有向图有n(n-1)条边,则此图为有向完全图 (这又是为什么?)


邻接顶点
(Adjacency Vertex)

  • 如果(u, v) 是 E(G) 中的一条边,则称 u 与 v 互为邻接顶点
  • 两个顶点之间有一条有向边,则称两个顶点相邻

子图
Subgraph

  • 设有两个图G=(V, E) 和G‘=(V‘, E‘)。若V‘≤ V 且E≤‘E, 则称图G‘是图G的子图


Weights

  • 某些图的边具有与它相关的数, 称之为。这种带权图叫做网络

顶点的度
(degrees of the vertices)

  • 一个顶点v的度是与它相关联的边的条数。记作TD(v)。
  • 在有向图中, 顶点的度等于该顶点的入度(in-degree)出度(out-degree)之和
  • 顶点 v 的入度是以 v 为终点的有向边的条数, 记作 ID(v)
  • 顶点 v 的出度是以 v 为始点的有向边的条数, 记作 OD(v)

路径
Path

  • 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, …, vpm,到达顶点vj。则称顶点序列 (vi vp1 vp2 ... vpm vj) 为从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、...、(vpm, vj) 应是属于E的边。 ###路径长度
  • 非带权图的路径长度是指此路径上边的条数。
  • 带权图的路径长度是指路径上各边的权之和。 ###简单路径
  • 若路径上各顶点 v1, v2, ..., vm 均不 互相重复, 则称这样的路径为简单路径 ###回路 loop
  • 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径为回路或环


连通图与连通分量

  • 在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2**连通**。
  • 如果图中任意一对顶点都是连通的, 则称此图是连通图
  • 非连通图的极大连通子图叫做连通分量

强连通图与强连通分量

  • 在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。(任意两个顶点相互可达)
  • 非强连通图的极大强连通子图叫做强连通分量

生成树(Spaning
tree)

  • 一个连通图的生成树是其极小连通子图,在 n 个顶点的情形下,有 n-1 条边。

图的基本知识就到这里了,如果有必要可以继续往下看。


特别注意的点

悬挂点

  • 度数为1的点为悬挂点,与之相关联的边称为悬挂边。

握手定理

  • 所有顶点的度数等于边数的两倍
  • 在任何顶点中,奇度顶点的个数是偶数 (为什么?)

欧拉图

  • a = 通过图中所有边有且仅有一次行遍所有顶点的通路,称为欧拉通路
  • b = 通过图中所有边有且仅有一次行遍所有顶点的回路,称为欧拉回路
  • a && b为欧拉图, a && ~b为半欧拉图

无向图是欧拉图当且仅当G是连通图且没有奇度顶点

  • 证明比较难讲,但是想起来很好想,如果有了奇度顶点,出去怎么回来?

相关文献:哥尼斯堡七桥问题

  • 有向图G是半欧拉图的条件是G是连通的且恰有两个奇度顶点
  • 有向图D是欧拉图的条件是 当且仅当D是强联通的且每个顶点的入度 == 出度

哈密顿图

  • a = 通过图中所有顶点一次且仅一次的通路称为哈密顿通路
  • b = 通过图中所有顶点一。。。。。。。。。回路称为哈密顿回路
  • 平凡图属于哈密顿图。
  • 树也是图。树是什么样的图?顶点为n,边数为n-1的图
空图
  • 顶点集为空的图,定义为空图
孤立点
  • 没有关联边的顶点称为孤立点

图的表示方法
C语言

邻接矩阵(Adjacency
Matrix)


逻辑结构

  • 在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表,还有一个表示各个顶点之间关系的邻接矩阵。
  • 设图 A = (V, E) 是一个有 n 个顶点的图, 图的邻接矩阵是一个二维数组 A.edge[n][n],定义

存储结构

  • 最简单的形式就是使用一个二维数组来存储,由于太过简单,这里就不展示了。

邻接表


逻辑结构

  • 邻接表是邻接矩阵的改进形式。为此需要把邻接矩阵的各行分别组织为一个单链表。
  • 在邻接表中,同一个顶点发出的边链接在同一个边链表中,每一个链结点代表一条边(边结点),结点中有另一顶点的下标 dest 和指针 link。对于带权图,边结点中还要保存该边的权值cost。
  • 顶点表的第 i 个顶点中保存该顶点的数据,以及它对应边链表的头指针adj。
  • 你联想到了什么?

存储结构

  • 使用vector来实现,或者使用new开辟新的数组
  • code
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

//If G is a tree
//half of n is enough;

#define MAXN 1000
// N 为节点个数
typedef vector <int> vint;
vector <vint> G(MAXN);
//遍历使用clear()函数, 清空使用的空间

void Insert(int a, int i)
{
    G[a].push_back(i);
}

void DFS(int v)
{
    for(int i = 0; i < G[v].size(); i++)
        DFS(G[v][i]);
}

int main()
{
    G.clear();
    return 0;
}

存边的写法,类似于哈希表中的拉链法


struct Arc
{
    int next_arc;
    int point;
};

#define MAXN 1000
#define MAXE 1000

int node[MAXN];
Arc arc[E];

//  以u开始,以v结束
int EdgeCount = 0;;
void AddEdge(int u, int v)
{
    arc[EdgeCount].next_arc = node[u];
    arc[EdgeCount].point = v;
    node[u] = EdgeCount;
    EdgeCount++;
}

图论的简单知识结构

时间: 2024-10-14 18:57:50

图论的简单知识结构的相关文章

图论模板简单整理

唔,图论部分暂时就看到这里了,整理一下最近学的东西 //最短路 //dijkstra void dijkstra() { memset(vis,0,sizeof(vis)); for(int i = 1;i <= n;i++) { d[i] = -1; } d[n] = 1; for(int k = 1;k <= n;k++) { double maxv = -1; int x = n; for(int i = 1;i <= n;i++) if(!vis[i] && d[

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点

本周安排

1, 开会明确本周的任务. 加强在信令解析上的练习,周一先拿去年的信令解析练手,同时熟悉磊叔写的Socket通信,加入信令解析策略,想好怎么在上面进行扩展. 周二进行信令解析的工作验收. 告知周二进行对上届代码在策略和结构的代码检视, 同时确认,一个老员工支撑上届他们代码的解说,特别是策略和结构上面. 2,周二,老员工对上届代码的解说,以及经验交流,主要是编码时的一些注意事项, 比如比赛上,人员的分工,设计的技巧,策略制定的技巧,UT编写的技巧,以及整个比赛的阶段把控. 同时确认各自的分工, 准

cdoj1580 简单图论问题

地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给出一个无向图,该图由nn个点和mm条边组成,每个点和每条边都有一个权值.对于该图的任意一个子图,我们定义A是该子图的点权和,B是该子图的边权和,C=A/b=AB是该子图的powerpow

HNNU 11657 简单的图论问题?【湖南省第十一届大学生计算机程序设计竞赛,双BFS】

原题链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11657&courseid=0 正如好手所说,搜索玩得就是标记 第一种方式稍微简单一点,第二种方式需要一个三维的标记,增加一个方向的标记,就和迷宫问题转弯次数一样. AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <

算法7-1:图论简单介绍

无向图 无向图由顶点和边组成.边用于连接两个顶点. 以下这张地图就是无向图的一个样例. OPTEproject OPTEproject的目标就是绘制整个互联网的样子. 下图是2010年的互联网.互联网也是无向图的一个样例.这张图是用LGL软件进行绘制的.有兴趣的同学可以研究一下:http://www.opte.org/ 术语 在图论中,有些术语是必需要知道的,不然没办法学习. 顶点:图中最主要的元素 边:连接两个顶点的线就是边 路径:由一个顶点到还有一个顶点所经过的边 环:从一个顶点出发,经过一

lh的简单图论

http://10.64.70.166/problem/1112 Description 众所周知,集训队的lh同学txdy,有一天他在写着代码,突然哼起了raprap,哟,哟哟,你看这个碗它又大又圆,就像这个题它又短又难,skrskr,skrskr. lhlh在着手解决一个图论的问题: 已知有一个nn个点的无向图,图中有mm条边,每条边的权值为w_iwi?. lhlh想知道,他从点aa走到点bb,所走的最长的边长最小值是多少? Input 第一行输入三个正整数n,m,qn,m,q,分别表示有n

图论大赛的简单分析

总体分析: 第一道题:一个字!水!!,只不过看数据的话那个第五个测评点会非常大,需要一个并查集剪枝维护才能A,但是考试的时候过了样例,就没考虑那么多,一共6个点,5个点开考20分钟秒过…… 第二道题:四个字!半水不水!!,做题时发现呵呵呵呵……(苦笑)把DFS全写完,样例过了,但是乍得一看数据范围,一下子就懵了.最后没有改用BFS,A过3个点,另外两个点栈溢出,开考50分钟后写完. 第三道题:如果你知道样例,基本上可以放弃了.可惜我用30分钟写了一个FLOYD无敌大暴力,五层循环把样例A过了,结