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;
}
}
}
















