【图论】最短路(一)

发现之前做的题很乱,用小笔记把看过的博客和题目分类记录一下,

代码参考了很多佬,是标注出来的链接,若不同意我就删掉(鞠躬)

找了几张好点的,图来源图中的id和acwing

1.dijkstra     依次找到距离集合最近的点加入集合

1.1朴素dijkstra

估计也用的少,见3.1 模板最短路x2

1.2堆优化版dijkstra

当点/边数目达10^5时,用了才能在1s内

void dijkstra(){
priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> heap;
heap.push({0,s});
dist[s]=0;


while(!heap.empty()){

    pair<long long ,long long>temp=heap.top();
    heap.pop();
    long long x=temp.first;long long y=temp.second;
    if(st[y])continue;
    st[y]=true;

    for(long long i=head[y];i!=-1;i=edge[i].next){//边的编号i
        long long t=edge[i].to;
        if(dist[t]>x+edge[i].w){
            dist[t]=x+edge[i].w;
            heap.push({dist[t],t});
        }
    }

}



}

2.bellman-ford      经过n-1轮对每条边进行松弛

最短路问题 Bellman-Ford(单源最短路径)(图解)_bellmanford算法图解-CSDN博客

2.1 bellman-ford


void bellman(){
for(int i=2;i<=n;i++)dist[i]=INF;
    dist[1]=0;

    
for(int i=1;i<=n-1;i++){
    bool ok=1;
    for(int j=1;j<=tot;j++){
        int u=edge[j].u;int v=edge[j].v;
        if(dist[u]!=INF&&dist[v]>dist[u]+edge[j].w){//dis[u]!=INF很是重要
    dist[v]=dist[u]+edge[j].w;
    ok=0;

        }

    }


    if(ok==1)break;

}

}

2.2 spfa 队列优化的

注意vis[u]=false;

void spfa(int s){
   
for(int i=1;i<=n;i++)dis[i]=INF,vis[i]=false;
queue <int> q;
q.push(s);
dis[s]=0,vis[s]=true;

while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;



for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;

if(dis[v]>dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;

if(!vis[v]){
    q.push(v);
    vis[v]=true;
    cnt[v]++;
}

}

}




}





}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]提供了使用Python的networkx库绘制网络图和计算最短加权路径的示例代码。该代码使用了一个包含顶点和边的列表,并使用add_nodes_from和add_weighted_edges_from方法将它们添加到图中。然后,使用nx.shortest_path_length方法计算了从顶点v1到顶点v11的最短加权路径长度为13。\[1\] 引用\[2\]提供了一个计算最短路径的Python程序示例。该程序使用了numpy和networkx库。首先,定义了一个包含顶点和边的列表,并使用add_nodes_from和add_weighted_edges_from方法将它们添加到图中。然后,使用nx.shortest_path_length方法计算了最短路径长度,并将结果存储在一个字典中。接下来,使用numpy创建了一个6x6的零矩阵,并使用两个嵌套的for循环将最短路径长度填充到矩阵中。最后,使用矩阵乘法计算了运力,并找到了最小运力和对应的位置。\[2\] 引用\[3\]提供了关于Dijkstra算法的一些背景信息。Dijkstra算法是一种寻找最短路径的算法,适用于所有权重大于等于0的情况。它可以用于解决从一个起始点到任意一个点的最短路径问题。\[3\] 综上所述,如果你想在Python中计算图论中的最短路径,可以使用networkx库和Dijkstra算法。你可以根据引用\[1\]和引用\[2\]中的示例代码进行操作。 #### 引用[.reference_title] - *1* *3* [运筹学——图论与最短距离(Python实现)](https://blog.csdn.net/weixin_46039719/article/details/122521276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数学建模:图论模型 — 最短路模型示例 (Python 求解)](https://blog.csdn.net/qq_55851911/article/details/124776487)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值