将图的邻接表表示转换成邻接矩阵表示
设图的顶点均存放在v[n]中,初始化邻接矩阵,遍历邻接表。在依次遍历顶点v[i]的边链表时,修改邻接矩阵第i行的元素值
若链表边结点的值为j,则令arcs[i][j] = 1;遍历完后,转换结束。此算法对无向图和有向图均使用
void Convert(ALGraph &G, int arcs[MaxVertexNum][MaxVertexNum])
{
for (int i = 0; i < G.arcnum; i++)
{
ArcNode *p = (G.vertices[i]).first; // 取出顶点i的第一条出边
while (p != NULL) // 遍历边链表
{
arcs[i][p->adjvex] = 1;
p = p->next; // 取出下一条边
}
}
}
设计一个算法,判断一个无线图G是否是一棵树
一个无向图G是一颗树的条件是:G必须是无回路的连通图或有n-1条变的连通图,采用后者判断
bool isTree(Graph &G)
{
for (int i = 1; i <= G.vexnum; i++)
visited[i] = false;
int Vnum = 0, Enum = 0;// 记录顶点数和边数
DFS(G, 1, Vnum, Enum, visited);
if (Vnum == G.vexnum && Enum == 2*(G.vexnum - 1))
return true;// 符合树的条件
else
return false;//不符合树的条件
}
void DFS ( Graph &G , int v , int &Vnum , int &Enum , int visited [])
{
//深度优先遍历图 G,统计访问过的顶点数和边数,通过 Vnum 和 Enum 返回
visited[v]= true;
Vnum ++;//做访问标记,顶点计数
int w = FirstNeighbor (G,v);//取v的第一个邻接顶点
while ( w!=-1){ //当邻接顶点存在
Enum++;//边存在,边计数
if (!visited[w])//当没访问过
DFS(G, w, Vnum, Enum, visited);
w = NextNeighbor(G, v, w);
}
}
DFS非递归
//DFS非递归
void DFS_Non_RC(AGraph &G,int v){
int w;//顶点序号
InitStack(S);
for(int i = 0i<G.vexnum;i++)
visited[i] = false;
Push(s,v);
visited[v] = true;//v入栈,并置为已访问
while(!Isempty(S))
{
k = Pop(S);//栈中退出一个顶点
visit(k);//先访问,再将其子节点入栈
for(w = FirstNeighbor(G,v);w>=0;w = NextNeighbor(G,v,w))
{
if(!visited[w])//未进过栈的顶点进栈
{
Push(S,w);
visited[w] = true;//做标记
}
}
}
}
输出邻接表中值为x的结点的邻接结点的所有信息
void printNeighborInfo(ALGraph *graph, char x) {
int i;
for (i = 0; i < graph->vexnum; i++) {
if (graph->vertices[i].data == x) { // 找到值为x的顶点
ArcNode *neighbor = graph->vertices[i].first;
printf("x的邻接结点为 %c: ", x);
while (neighbor != NULL) { // 遍历邻接结点
printf("%c ", graph->vertices[neighbor->adjbex].data); // 输出邻接结点的值
neighbor = neighbor->next;
}
printf("\n");
return;
}
}
printf("%c 的邻接结点为空\n", x);
}
计算邻接矩阵存储下的i顶点的入度和出度
int inDegree(MGraph* graph,int i)
{
int indegree;
for(int j= 0;j< graph->vexnum;j++)
{
if(graph->Edge[j][i] != 0)
indegree++;
}
return indegree;
}
int outDegree(MGraph* graph,int i)
{
int outdegree;
for(int j = 0;j< graph->vexnum;j++)
{
if(graph->Edge[i][j] != 0)
outDegree++;
}
return outDegree;
}