- 1.图的定义
- 1.由顶点的又穷非空集合和顶点之间边的集合的组成;表示为G=(V,E)其中V是点集合,E是边集合
- 图分为有向图和无向图。边上的值称为这条边的权。
- 2.图的术语
- 1.邻接,依附:无向图中,对于任意两个顶点vi和顶点vj,若存在边(vi,vj),则称顶点vi和顶点vj互为邻接点,同时称边(vi,vj)依附于顶点vi和顶点vj。
- 2.度,入度,出度:在无向图中,顶点v的度是指依附于该顶点的边数,通常记为TD (v);在有向图中,顶点v的入度是指以该顶点为弧头的弧的数目,记为ID (v);在有向图中,顶点v的出度是指以该顶点为弧尾的弧的数目,记为OD (v)。
- 3.完全图:无向完全图:任意两顶点之间都有一条边,即n个顶点就有n*(n-1)/2条边。有向完全图:任意两顶点之间都存在方向相反的两条边,同样是n个顶点边数是无向完全图的2倍。
- 二、图的实现
- 1.图的存储结构
- 1.邻接矩阵。
- 2.邻接表。
- 邻接矩阵:a[i][j]表示边 ;i,j表示两个点,0为没有边,1为这两个点间有边。
- 基本声明(课本摘取)
- class MGraph
- {
- public:
- MGraph(){}
- MGraph(int a[],int b[MaxSize][MaxSize],int n, int e );
- private:
- int vertex[MaxSize]; //顶点个数信息
- int visited[MaxSize];
- int arc[MaxSize][MaxSize];
- int vertexNum, arcNum;
- };
- 构建(课件摘取)
- MGraph::MGraph(int a[],int b[MaxSize][MaxSize],int n, int e)
- {
- vertexNum=n; arcNum=e; int i,j;
- for ( i=0; i<vertexNum; i++) {
- vertex[i]=a[i];
- visited[i]=0;
- }
- for ( i=0; i<vertexNum; i++) {//初始化邻接矩阵
- for ( j=0; j<vertexNum; j++) {
- arc[i][j]=0; }
- }
- for (int i=0; i<vertexNum; i++){//初始化邻接矩阵
- for (int j=0; j<vertexNum; j++){
- arc[i][j]=b[i][j]; }
- }
- }
- 到这里又有两个比较重要的内容出现。深度优先遍历,广度优先遍历。
- 深度优先。
- 类似于树中的前序遍历。从特定的结点v开始。
- 访问结点v。
- 从v未被访问的临接点中选一个n访问,再从n开始深度优先遍历,直到所有结点被访问过。
- 这也是用到了递归思想,我们也有一个标记数组,被访问过的序号会被标记1。
- 广度优先。
- 类似于树中的层序遍历。也是从特定结点v开始。
- 访问结点v。
- v的邻接点有v1.v2.v3...等,依次访问他们。
- 再从这些结点依次出发访问它们未被访问的结点。直到所有节点被访问过。
- 这个也是采用递归思想,也用到了队列,访问到入队,所有邻接点都被访问过出队。直到队空。
- 这两个的具体代码就不给出了,在书中和课件中都十分详细。
邻接表
邻接表有顶点表结点和边表结点两种。前者存结点后者存与他邻接的点
顶点结点具体定义:
template <class T>
struct VertexNode
{
T vertex;
ArcNode *firstedge;
};
表结点具体定义:
struct ArcNode
{
int adjvex;
ArcNode *next;
};
结构声明(课件摘取)
template <class T>
class ALGraph
{
public:
ALGraph(T a[ ], int n, int e);
void DFSTraverse(int v);
void BFSTraverse(int v);
private:
visited[MaxSize]; VertexNode adjlist[MaxSize];
int vertexNum, arcNum;
};
构造(课件摘取)
template <class T>
ALGraph::ALGraph(T a[], int n, int e)
{
vertexNum=n; arcNum=e;
for (i=0; i<vertexNum; i++)
{
adjlist[i].vertex=a[i]; visited[i]=0;
adjlist[i].firstedge=NULL;
}
for (k=0; k<arcNum; k++)
{
cin>>i>>j;
s=new ArcNode;
s->adjvex=j;
s->next=adjlist[i].firstedge;
adjlist[i].firstedge=s;
}
深度优先遍历和广度优先遍历 大体与邻接矩阵差不多就不多介绍。
大体比较重要的的内容大概这些,如有错误,多多指导。