在无向图中,如果从顶点Vi到顶点Vj有路径,则称Vi和Vj连通。若图中任意两个两个顶点之间都连通——连通图。
极大连通子图——连通分量。(无向图)
从一个顶点开始作为一个子图,逐个添加和这个子图有边相连的顶点,直到所有相连的顶点都被纳入到图中所生成的子图就是一个极大连通子图。
完全图——任意两个顶点之间都有边或弧
对于无向图,有n个顶点,则有有n(n-1)/2条边;
对于有向图,有n个顶点,则有n(n-1)条边。
判定两个顶点Vi和Vj之间是否有路径
若是有有向图,对顶点Vi作深度优先搜索,即DFS(G,Vi),若存在路径,则在搜索过程中必有visited[Vj]=1。若是无向图,对其中任意一顶点作DFS即可。
求解一个无向图的连通分量个数,并判定该无向图的连通性。
选择任意某一个顶点V,执行DFS(G,V)算法时,可以访问到V所在的连通分量中的所有顶点,所以遍历整个图而选择的初始出发点的个数即为图的连通分量的个数。
若连通分量的个数为1,表示图G是连通的,否则非连通。
图的基本数据结构:
图的基本数据结构:
#define MAX_VERTEX_NUM 20 //图中最大节点数目
#define INFINITY 10000
typedef struct ArcNode //边表结点,即邻接链表的表结点
{
int adjvex; //所指向下个结点的位置,对应数组中的下标
struct ArcNode *nextarc; //指向下一条弧的指针
int weight; //权重
}ArcNode;
typedef struct VNode //顶点结构
{
VertexType data; //顶点数据类型
ArcNode *firstarc; //顶点相关弧链表的头结点
}VNode,AdjList[MAX_VERTEX_NUM]; //顶点结点
typedef struct
{
AdjList vertices; //图的顶点数组
int vexnum,arcnum; //图的顶点数和边数
}ALGraph;
typedef struct ArcNode //边表结点,即邻接链表的表结点
{
int adjvex; //所指向下个结点的位置,对应数组中的下标
struct ArcNode *nextarc; //指向下一条弧的指针
int weight; //权重
}ArcNode;
typedef struct VNode //顶点结构
{
VertexType data; //顶点数据类型
ArcNode *firstarc; //顶点相关弧链表的头结点
}VNode,AdjList[MAX_VERTEX_NUM]; //顶点结点
typedef struct
{
AdjList vertices; //图的顶点数组
int vexnum,arcnum; //图的顶点数和边数
}ALGraph;
#include<stdlib.h>
#include<string.h>
#define MAX_VERTEX_NUM 20
typedef int VertexType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
int weight;
}ArcNode;
typedef struct VNode
{ </