1.图的基础知识

图:由顶点的有穷非空集和顶点之间的边的集合组成。通常为G(V,E)

有向图:每条边都有方向   无向图:每条边都没有方向

有向完全图:若有向图有n个顶点,且具有n(n-1)个边  无向完全图:若无向图有n个顶点,且具有(n(n-1)/2)

简单路径:序列中顶点不重复出现的路径成为简单路径 

回路:若一条路径中第一个顶点和最后一个顶点相同,则这条路径是一条回路

连通图:在无向图中,如果任意两个顶点之间都连通的话,则称图为连通图

强连通图:在有向图中,如果图中任意两个顶点vi和vj,从vi到vj和从vj到vi之间都有路径的话,则称图为强连通图

2.图的定义

a.邻接矩阵的结构体定义

typedef struct MGraph{
	int edges[maxsize][maxsize];
	int n,e;
}MGraph;

b.邻接表的结构体定义

typedef struct EdgeNode{
	int adjvex;
	int weight;
	struct EdgeNode *next;
}EdgeNode;

typedef struct VertexNode{
	char data;
	struct EdgeNode *firstEdge;
}VertexNode;

typedef struct AGraph{
	VertexNode adjList[maxsize];
	int n,e;
}AGraph;

3.图的深度优先遍历方式

a.深度优先搜索遍历

//邻接矩阵的深度优先搜索遍历
int visited[maxsize];
void DFS(MGraph *G,int v)
{
	visited[v]=1;
	cout<<G->vertex[v]<<",";
	for(int i=0;i<G.n;i++)
		if(G->edges[v][i]==1&&visited[i]==0)
			DFS(G,i);
} 

//邻接表的深度优先搜索遍历
int visited[maxsize];
void DFS(AGraph *g,int v)
{
	visited[v]=1;
	cout<<G->adjList[v].data<<","<<;
	EdgeNode *p;
	p=G->adjList[v]->firstEdge;
	while(p!=NULL)
	{
		if(visited[p->adjvex]==0)
			DFS(G,p->adjvex);
		p=p->next;
	}
}

b.广度优先搜索遍历

//邻接矩阵的广度优先搜索遍历
int visited[maxsize];
void BFS(MGraph *G,int v)
{
	int queue[maxsize];int front=0,rear=0;
	int i,j;
	visited[v]=1;Visit(G->vertx[v]);
	rear=(rear+1)%maxsize;
	queue[rear]=v;
	while(front!=rear)
	{
		front=(front+1)%maxsize;
		i=queue[front];
		for(j=0;j<G->n;j++)
		{
			if(G->edges[i][j]==1&&visited[j]==0)
			{
				visited[j]=1;Visit(G->vertex[j]);
				rear=(rear+1)%maxsize;
				queue[rear]=j;
			}
		}
	}
} 

//邻接表的广度优先搜索遍历
int visited[maxsize];
void BFS(AGraph *G,int v)
{
	int queue[maxsize];int front=0,rear=0;
	EdgeNode *p;int j;
	visited[v]=1;Visit(G->adjList[i]->data);
	rear=(rear+1)%maxsize;
	queue[rear]=v;
	while(front!=rear)
	{
		front=(front+1)%maxsize;
		j=queue[front];
		p=G->adjList[j].fristedge;
		while(p!=NULL)
		{
			if(visited[p->adjvex]==0)
			{
				visited[p->adjvex]=0;
				Visit(G->adjList[p->adjvex].data);
				rear=(rear+1)%maxsize;
				queue[rear]=p->adjvex;
			}
			p=p->next;
		}
	} 
}