计算机考研常用算法分享(五) 图

计算机考研常用算法分享(五) 图,第1张

计算机考研常用算法分享(五) 图 五、图

数据结构

①邻接矩阵法存储
#define MaxVertexNum 100	//最大顶点数
typedef char VertexType;	//顶点类型定义
typedef int EdgeType;		//边类型定义
typed struct
{
    VertexType Vex[MaxVertexNum];		//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵
    int vexnum,arcnum;	//顶点数、弧数
} MGraph;

②邻接表法存储
#define MaxVertexNum 100	//最大顶点数
typedef struct ArcNode
{
    int adjvex;			//弧所指向的顶点位置
    struct ArcNode * next;	//指向下一条弧的指针
} ArcNode;
typedef struct VNode 		//表结点
{
    VertexType data;		//顶点信息
    ArcNode * first;		//指向第一条依附于该顶点的弧的指针
} VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
    AdjList vertices;		//邻接表
    int vexnum,arcnum;		//图的顶点数和弧数
} ALGraph;
1、图的初始化(邻接矩阵)
void CreateGraph(MGraph &G)
{
    int i,j,k,weight;
    int gn,ge;
    printf("请输入顶点数和边数:");
    scanf("%d %d",&Gn,&Ge);
    printf("请输入顶点:");
    for(i = 0; i < Gn; i++)
        scanf("%d",&vexs[i]);
    for(i = 0; i < Ge; i++)
    {
        for(j = 0; j < Gn; j++)
        {
            G.AdjMatrix[i][j] = infinity;
        }
    }
    printf("请输入边的顶点下标i,j以及权重w :");
    for(k = 0; k < Ge; k++)
    {
        scanf("%d %d %d",&i,&j,&weight);
        G.AdjMatrix[i][j] = weight;
        G.AdjMatrix[i][j] = G.AdjMatrix;
    }
}
2、广度优先遍历
bool visit[MAX_VERTEX_NUM];
void BFST(Graph G)         //访问标记数组
{
    for(i = 0; i < G.vexnum; i++)
        visit[i] = false;   //访问标记数组初始化
    InitQueue(Q);           //初始化辅助队列
    for(i = 0; i < G.vexnum; i++) //从0号结点开始遍历
    {
        if(!visit[i])
            BFS(G,i);
    }
}
void BFS(Graph G,int v)
{
    visit(v);           //访问初始结点v
    visited(v) = true;      //置访问标记
    EnQueue(Q,v);
    while(!IsEmpty(Q))
    {
        DeQueue(Q,v);
        //检测v所有邻接结点
        for(w = FirstNeighbor(G,v),w >= 0; w = NextNeighbor(G,v,w))
            if(!visited[w]) 		//w为v当前未访问的邻接结点
            {
                visit(w);
                visited[w] = true;
                EnQueue(Q,w);
            }
    }
}
3、深度优先遍历
bool visit[MAX_VERTEX_NUM];
void DFST(Graph G)         //访问标记数组
{
    for(i = 0; i < G.vexnum; i++)
        visit[i] = false;   //访问标记数组初始化
    for(i = 0; i < G.vexnum; i++) //从0号结点开始遍历
    {
        if(!visit[i])
            DFS(G,i);
    }
}
void DFS(Graph G,int v)
{
    visit(v);           //访问初始结点v
    visited(v) = true;      //置访问标记
    for(w = FirstNeighbor(G,v),w >= 0; w = NextNeighbor(G,v,w))
        if(!visited[w])		DFS(G,w);	//w为v当前未访问的邻接结点
}
4、计算顶点i的出度(邻接矩阵)
int getOutDegree(MGraph G,VertexType i)
{
    int j,sum = 0;
    for(j = 0; j < G.vernum; j++)
    {
        if(AdjMatrix[i][j] == 1)
        {
            sum++;
        }
    }
    return sum;
}
5、计算顶点i的入度(邻接矩阵)
int getInDegree(MGraph G,VertexType i)
{
    int j,sum = 0;
    for(j = 0; j < G.vernum; j++)
    {
        if(AdjMatrix[j][i] == 1)
        {
            sum++;
        }
    }
    return sum;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5581252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存