图的相关算法

将图的邻接表表示转换成邻接矩阵表示

设图的顶点均存放在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu丶ying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值