路径邻接表 head[] next[]

添加 a->b 路径代码:

int tot = 0; //全局变量,表示第几条路径
int head[LEN] = {0};
int next[LEN] = {0};


// 存储 a->b 路径
void add(int a, int b) {
	++tot;  // 路径标号,第几条路径

	next[tot] = head[a]; 
	head[a] = tot;

	des[tot] = b;  //存储终点,表示 第tot条路径 的终点是b
}

//head[] 的数组下标为地点
//next[] 的数组下标为第几条路径
//des[]  的数组下标为第几条路径

//head[] next[] 数组里的元素在创建时必须初始化为零    

假设插入如下路径:a->b,  a->c,  a->d,  b->e,  a->e

先初始化 head,next 数组,都初始化为 0,

head[ a ] = 0,head[ b ] = 0,... ,head[ e ] = 0

next[ a ] = 0,next[ b ]=0,... ,next[ e ] = 0   (注意 a, b, c, d, e 可以化作数字 1, 2, 3, 4, 5)

插入 a->b:   ++tot = 1(第1条路径),      next[ 1 ] = head[ a ] = 0,         head[ a ] = tot = 1,      des[ 1 ] = b(终点是b)

插入 a->c:   ++tot = 2(第2条路径),      next[ 2 ] = head[ a ] = 1,          head[ a ] = tot = 2,      des[ 2 ] = c(终点是c)

插入 a->d:   ++tot = 3(第3条路径),      next[ 3 ] = head[ a ] = 2,          head[ a ] = tot = 3,      des[ 3 ] = d(终点是d)

插入 b->e:   ++tot = 4(第4条路径),      next[ 4 ] = head[ b ] = 0,          head[ b ] = tot = 4,      des[ 4 ] = e(终点是e)

插入 a->e:   ++tot = 5(第5条路径),      next[ 5 ] = head[ a ] = 3,           head[ a ] = tot = 5,     des[ 5 ] = e(终点是e)

遍历以 a 为起点的所有路径:

for(int i = head[a]; i; i = next[i]){
    
}

1、遍历以 a 为起点的路径:

i = head[ a ] = 5;

i = 5,  des[ 5 ] = e   (终点是e,路径:a -> e)   i = next[ 5 ] = 3;   //第5条路径

i = 3,  des[ 3 ] = d   (终点是d,路径:a -> d)   i = next[ 3 ] = 2;   //第3条路径

i = 2,  des[ 2 ] = c   (终点是c,路径:a -> c)   i =  next[ 2 ] = 1;   //第2条路径

i = 1,  des[ 1 ] = b   (终点是b,路径:a -> b)   i = next[ 1 ] = 0;   //第1条路径

i = 0 ( 退出循环 )

2、遍历以 b 为起点的路径:

i = head[ b ] = 4;

i = 4,  des[ 4 ] = e   (终点是e,路径:a -> e)   i = next[ 4 ] = 0;    //第4条路径

i = 0 ( 退出循环 )

3、假设遍历以 e 为起点的路径,当然并不存在以 e 为起点的路径,在初始化 i = head[ e ] = 0,就直接退出遍历循环了

 

读者还可以自己添加一个 len[ ] 数组存储每条路径的长度,数组下标为 tot ( 路径标号 )  ( 和 des[ ] 数组用法一致 )

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Qt和邻接链表实现Dijkstra算法的示例代码: ``` #include <QtDebug> #include <QMap> #include <QSet> // 邻接链表节点 struct AdjListNode { int dest; int weight; AdjListNode* next = nullptr; }; // 邻接链表 class AdjList { public: AdjListNode* head = nullptr; }; // 加权有向图 class WeightedGraph { public: QMap<int, AdjList> adjListMap; // 邻接链表映射表 void addEdge(int src, int dest, int weight) { AdjListNode* newNode = new AdjListNode{ dest, weight }; newNode->next = adjListMap[src].head; adjListMap[src].head = newNode; } }; // Dijkstra算法 QMap<int, int> dijkstra(WeightedGraph graph, int src) { QMap<int, int> dist; // 源节点到各节点的距离 QSet<int> visited; // 已访问节点集合 for (auto key : graph.adjListMap.keys()) { dist[key] = INT_MAX; // 初始化距离为无穷大 } dist[src] = 0; // 源节点到自身距离为0 for (int i = 0; i < graph.adjListMap.size() - 1; i++) { int minDist = INT_MAX; int minNode = -1; // 查找未访问节点距离最小的节点 for (auto key : graph.adjListMap.keys()) { if (!visited.contains(key) && dist[key] < minDist) { minDist = dist[key]; minNode = key; } } if (minNode == -1) break; // 所有节点均已访问,结束算法 visited.insert(minNode); // 标记节点为已访问 // 更新所有邻接节点的距离 for (auto node = graph.adjListMap[minNode].head; node != nullptr; node = node->next) { if (!visited.contains(node->dest) && dist[minNode] != INT_MAX && dist[minNode] + node->weight < dist[node->dest]) { dist[node->dest] = dist[minNode] + node->weight; } } } return dist; } int main() { WeightedGraph graph; graph.addEdge(0, 1, 4); graph.addEdge(0, 7, 8); graph.addEdge(1, 2, 8); graph.addEdge(1, 7, 11); graph.addEdge(2, 3, 7); graph.addEdge(2, 8, 2); graph.addEdge(2, 5, 4); graph.addEdge(3, 4, 9); graph.addEdge(3, 5, 14); graph.addEdge(4, 5, 10); graph.addEdge(5, 6, 2); graph.addEdge(6, 7, 1); graph.addEdge(6, 8, 6); graph.addEdge(7, 8, 7); QMap<int, int> dist = dijkstra(graph, 0); qDebug() << dist; // 输出:{0=0, 1=4, 2=12, 3=19, 4=21, 5=11, 6=9, 7=8, 8=14} return 0; } ``` 在此示例代码,我们首先定义了邻接链表节点`AdjListNode`和邻接链表`AdjList`。然后,我们定义了加权有向图`WeightedGraph`,它包含一个邻接链表映射表`adjListMap`,用于存储所有节点的邻接链表。通过`addEdge()`方法,我们可以向图添加一条从源节点到目标节点的有向边,并指定它的权重。 接下来,我们实现了Dijkstra算法,它接受一个加权有向图和源节点作为参数,并返回一个映射表`dist`,其包含源节点到所有其他节点的最短距离。在算法,我们使用了一个未访问节点集合`visited`和一个源节点到各节点的距离映射表`dist`。我们首先将所有节点的距离初始化为无穷大,然后将源节点到自身距离设为0。然后,我们重复以下步骤,直到所有节点均已访问: 1. 在未访问节点查找距离最小的节点。 2. 标记该节点为已访问。 3. 更新其所有邻接节点的距离。 最后,我们在`main()`函数创建一个加权有向图,并使用Dijkstra算法计算源节点到所有其他节点的最短距离。最终输出结果为一个映射表,其键表示节点编号,值表示源节点到该节点的最短距离。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值