看 迪杰斯特拉(Dijsktra)算法体会

本文介绍了一种使用C语言实现的迪杰斯特拉算法,该算法用于寻找加权图中从一个起始顶点到其余各顶点的最短路径。通过不断更新最短路径并选择未被访问过的最近节点作为新的起点来逐步完成整个图的最短路径计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迪杰斯特拉 看啊哈算法中迪杰斯特拉算法体会;

    算法思路 ;

1.先找到源头到其他点的最短路;

2.以最短路作为中转点进行比较,用一个dis数组保存源头到他的最优距离

3.用循环进行最优筛选;


#include<stdio.h>
int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min;
int main()
{
    int inf=9999999;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(m==n&&n==0) return 0;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(i==j) e[i][j]=0;
                else e[i][j]=inf;

            }
        }
        for(i=1; i<=m; i++)
        {
            scanf("%d%d%d",&t1,&t2,&t3);
            e[t1][t2]=e[t2][t1]=t3;
        }
        for(i=1; i<=n; i++)
        {
            dis[i]=e[1][i];
        }
        for(i=0; i<=n; i++)
        {
            book[i]=0;
        }
        book[1]=1;

        for(i=1; i<n; i++)
        {
            min=inf;
            for(j=1; j<=n; j++)
            {
                if(book[j]==0&&dis[j]<min)
                {
                    min=dis[j];
                    u=j;

                }
            }
            book[u]=1;
            for(v=1; v<=n; v++)
            {
                if(e[u][v]<inf)
                    if(dis[v]>dis[u]+e[u][v])
                        dis[v]=dis[u]+e[u][v];
            }

        }
        // for(i=1; i<=n; i++)
        printf("%d\n",dis[n]);
    }
    return 0;
}


### 迪杰斯特拉算法与个性化PageRank的关系 迪杰斯特拉算法是一种用于计算加权图中最短路径的经典方法[^1]。它通过维护一个距离数组并逐步更新节点的距离来找到源节点到其他所有节点的最短路径。该算法的核心在于优先队列的选择机制,使得每次扩展的是当前已知离起点最近的未访问节点。 相比之下,个性化PageRank (Personalized PageRank, PPR) 是一种基于随机游走模型的方法,广泛应用于推荐系统、链接分析等领域。PPR 的核心思想是从某个特定节点出发,在网络上执行带重启概率的随机游走过程,最终得到目标节点相对于起始节点的重要性得分。这种重要性得分可以被看作是一个分布向量,表示从初始节点到达各个节点的概率[^2]。 尽管两者解决的问题不同——前者关注于最短路径问题而后者侧重于节点间的相对重要性评估——它们之间仍然存在一些联系: #### 实现上的相似之处 - **迭代更新**:两种算法都涉及某种形式的状态更新操作。对于迪杰斯特拉算法来说,这是指不断调整候选节点集合中的估计距离;而对于 PPR,则涉及到反复应用转移矩阵直至收敛。 - **贪心策略的应用**:虽然严格意义上讲 PP R并不完全属于贪婪类别的优化技术,但在每一步选取最大可能性方向继续前进这一点上有异曲同工之妙。具体而言,Dijkstra 总是挑选目前看来最优解作为下一步探索对象,类似地,PPR 中每一次跳跃也倾向于沿着更可能的方向发展。 #### 数学建模差异对比 然而需要注意的是,这两种方法背后所依赖的基础理论框架完全不同: - Dijkstra 基于几何空间内的度量结构; - 而 PPR 则建立在网络拓扑特性之上,并且引入了马尔可夫链的概念来进行描述和求解。 以下是使用 Python 编写的简单版本的 Dijsktra 和 PPR 算法实现示例: ```python import heapq from collections import defaultdict def dijkstra(graph, start_node): distances = {node: float('infinity') for node in graph} distances[start_node] = 0 priority_queue = [(0, start_node)] while priority_queue: current_distance, current_vertex = heapq.heappop(priority_queue) if current_distance > distances[current_vertex]: continue for neighbor, weight in graph[current_vertex].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances def personalized_pagerank(graph, teleportation_prob=0.15, max_iter=100, tol=1e-6): n_nodes = len(graph) pr_values = [1/n_nodes]*n_nodes transition_matrix = [[graph[i][j]/sum(graph[i]) if sum(graph[i]) != 0 else 0 for j in range(n_nodes)] for i in range(n_nodes)] for _ in range(max_iter): new_pr_values = [] diff_sum = 0 for v in range(n_nodes): rank_contributions = [transition_matrix[u][v]*pr_values[u] for u in range(n_nodes)] new_value = teleportation_prob*(1/n_nodes) + (1-teleportation_prob)*sum(rank_contributions) diff_sum += abs(new_value - pr_values[v]) new_pr_values.append(new_value) if diff_sum < tol: break pr_values = new_pr_values return pr_values ``` 上述代码分别展示了如何利用堆数据结构加速标准版 Dijkstra 计算以及基础型 PPR 更新逻辑的具体流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值