数据结构与算法基础 模块四

今天主要是有关于图的分享。

定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

  在图中需要注意的是:

  (1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)

  (2)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。

  (3)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。

图是由顶点集V和边E组成。每一条边就是一个点对(v,w)。如果点对是有序的(每一个点的下一个点是固定的),那么图被称为有向图,否则就是无向图。有的时候边还有权值。

图的路径是指一个顶点序列,v1,v2,v3,v4....vn,这条路径的长是这条路径的边数,等于n-1。

如果图中含有一条从一个顶点到他自身的边(v,v),那么路径v,v也叫做环。

简单路径的概念是指路径上所有的点都是互异的,但是第一个和最后一个点可能是同一个。

有向图中的圈是从一个顶点出发,回到自己,并且路径的长至少为1。如果这个路径是简单路径,则这个圈是简单圈。

而无向图的圈,要求这个边是互异的。

主要代码是:


void CreateUDG(Graph *G) 
    int i, j, k; 
    VertexType  va, vb;      //变量,存储顶点A和B
  
 printf("Input the number of the vertex and arc:\n");
 scanf("%d %d",&G->vexnum, &G->arcnum);
 printf("input the name of the vertex:\n");
 for(i=0; i<G->vexnum; i++)
  scanf("%s",G->vexs[i]);
    for (i = 0; i < G->vexnum; ++i)      // 初始化邻接矩阵 
        for (j = 0; j < G->vexnum; ++j) 
        { 
            G->arcs[i][j].adj  = 0;      // 无向图,所以都初始值为0 
        }  
    for (k = 0; k < G->arcnum; ++k) 
    { 
 printf("\nInput the first vertex:\n");
        scanf("%s",va);
        i = Locate(G, va);              
        printf("\nInput the last vertex:\n");
 scanf("%s",vb);
 j = Locate(G, vb); 
        G->arcs[i][j].adj = G->arcs[j][i].adj = 1;    // 无向图 ,两个顶点是一样的
    } 
    G->kind = UDG; 
}

如果一个无向图中从每一个顶点出发,都有到其他每个定点的路径,则这个图是联通的。具有这种性质的有向图被称为强连通图。

如果把一个有向图的所有有向边去掉方向形成的无向图被称为这个有向图的基础图,也叫基图。

有向图不是强连通,但是他的基图是连通的,则被称为弱连通。

顶点的度

  顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。

邻接

  ①若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);

  ②若有向图中存在一条边<V3,V2>,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3

完全图是其每一对顶点之间都存在一条边的图。

邻接表表示:

 邻接表的表现形式和散列有些像。数组的每个下标中都存放这一个互异的顶点作为头节点,然后以链表方式在头节点之后存储它的邻接点。

 在用邻接表描述有向图时,实质存储的是点a->点b->点c。需要注意的是每个顶点可能会出现多次。例如a->b; c->a->b;  a,b都出现了两次。

而在无向图中,存储的是点a的所有出度和入度。即所有和他有关的边。
posted @ 2018-07-20 18:10  大大比巴卜  阅读(150)  评论(0编辑  收藏  举报