邻接表c++实现及无权图的单源最短算法

#include <iostream>
#include <queue>
using namespace std;
bool Visited[100] = { false };
#define MaxVertexNum 100/*最大顶点数设为100*/
typedef int Vertex;/*用顶点下标表示顶点,为整形*/
typedef int WeightType;/*边的权值设为整型*/
typedef char DataType;/*顶点存储的数据类型设为字符型*/
/*边的定义*/
typedef struct ENode* PtrToENode;
struct ENode {
    Vertex v1, v2;/*有向边<v1,v2>*/
    WeightType Weight;//权重
};
typedef PtrToENode Edge;
//邻接点的定义
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
    Vertex AdjV;//邻接点下标
    WeightType Weight;//边权重
    PtrToAdjVNode Next;//指向下一个邻接点的指针
};
//顶点表头结点的定义
typedef struct VNode {
    PtrToAdjVNode FirstEdge;//边表头指针
    DataType Data;//存顶点的数据
}AdjList[MaxVertexNum];//AdjList是邻接表类型
//图结点的定义
typedef struct GNode* PtrToGNode;
struct GNode {
    int Nv;//顶点数
    int Ne;//边数
    AdjList G;//邻接表
};
typedef PtrToGNode LGraph;//以邻接表方式存储的图类型
LGraph CreateGragp(int VertexNum) {
    //初始化一个有VertexNum个顶点但没有边的图
    Vertex V;
    LGraph Graph;
    Graph = (LGraph)malloc(sizeof(struct GNode));//建立图
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    //初始化邻接表头指针
    for (V = 0; V < Graph->Nv; V++) {
        Graph->G[V].FirstEdge = NULL;
    }
    return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
    PtrToAdjVNode NewNode;
    //插入边<v1,v2>
    //为v2建立新的邻接点
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->v2;
    NewNode->Weight = E->Weight;
    //将v2插入v1的表头
    NewNode->Next = Graph->G[E->v1].FirstEdge;
    Graph->G[E->v1].FirstEdge = NewNode;
    //若是无向图 还要插入边<v2,v1>
    //为v1建立新的邻接点
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->v1;
    NewNode->Weight = E->Weight;
    //将v1插入v2的表头
    NewNode->Next = Graph->G[E->v2].FirstEdge;
    Graph->G[E->v2].FirstEdge = NewNode;
}
LGraph BuildGrapg()
{
    LGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
    cin >> Nv;
    Graph = CreateGragp(Nv);
    cin >> Graph->Ne;
    if (Graph->Ne != 0) {
        E = (Edge)malloc(sizeof(struct ENode));
        for (i = 0; i < Graph->Ne; i++) {
            cin >> E->v1 >> E->v2 >> E->Weight;
            InsertEdge(Graph, E);
        }
    }
    //如果顶点有数据 读入数据
    for (V = 0; V < Graph->Nv; V++) {
        cin >> Graph->G[V].Data;
    }
    return Graph;
}
void Visit(Vertex v) {
    printf("正在访问%d\n", v);
}
void Dfs(LGraph Graph, Vertex v, void (*Visit)(Vertex)) {
    //以v为出发点对邻接表存储的图Graph进行DFS搜索
    PtrToAdjVNode W;
    Visit(v);//访问第v个顶点
    Visited[v] = true;//标记已访问
    for (W = Graph->G[v].FirstEdge; W; W = W->Next) {
        if (!Visited[W->AdjV])Dfs(Graph, W->AdjV, Visit);
    }
}
//无权图的单源最短路算法 邻接表存储
/*dist[]和path[]全部初始化为-1*/
int dist[100], paht[100];
void Unweighted(LGraph Graph, int dist[], int path[], Vertex s) {
    for (int i = 0; i < 100; i++) {
        dist[i] = -1;
        path[i] = -1;
    }
    queue<int>q;
    Vertex v;
    PtrToAdjVNode w;
    dist[s]= 0;
    q.push(s);
    while (!q.empty()) {
        v = q.front();
        q.pop();
        for (w = Graph->G[v].FirstEdge; w; w = w->Next) {
            if (dist[w->AdjV] == -1) {
                dist[w->AdjV] = dist[v] + 1;
                path[w->AdjV] = v;
                q.push(w->AdjV);
            }
        }
    }
}

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值