首页 > 其他分享 >最短路

最短路

时间:2024-08-09 18:55:03浏览次数:4  
标签:10005 int 短路 源点 dijkstra dis

最短路算法框架

单源最短路:求一个点到其他点的最短路
多源最短路:求任意两点的最短路

稠密图用邻接矩阵存,稀疏图用邻接表来存。

稠密图:m和n2一个级别
稀疏图:m和n一个级别

dijkstra算法

朴素版

用来求一个源点到其他点的最短距离

#include <bits/stdc++.h>
using namespace std;
struct edge{
    int v;//边的终点
    int w;//边权
};

vector<edge>e[10005];
int dis[10005];//存u到源点x的最小距离
bool vis[10005];//标记是否选过
 int n,m,x;//节点数,边数,源点


//时间复杂度在O(n*n)
void dijkstra(int x)
{
    memset(dis,INT_MAX,sizeof dis);
    dis[x]=0;
   
    for(int i=1;i<n;i++){//枚举的次数
         int u=0;
        for(int j=1;j<=n;j++)//找到未标记过的且距离最小的点
        {
            if(!vis[j]&&dis[j]<dis[u]) u=j;
        }
        vis[u]=1;
        for(auto t:e[u])//遍历邻边
        {
            int v=t.v,w=t.w;
            if(dis[v]>dis[u]+w) dis[v]=dis[u]+w;//如果距离更小就更新
        }
    }
}



int main()
{
   
    cin>>n>>m>>x;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        e[u].push_back({v,w});
    }
    dijkstra(x);
    cout<<dis[n];
}

堆优化版

#include <bits/stdc++.h>
#define int long long

using namespace std;
struct edge{
    int v;//边的终点
    int w;//边权
};

vector<edge>e[10005];
int dis[10005];//存u到源点x的最小距离
int vis[10005];//标记是否选过
 int n,m,x;//节点数,边数,源点
 
priority_queue<pair<int,int> >q;//大根堆,开小根堆去掉负号即可

//时间复杂度在O(m*logn)
void dijkstra(int x)
{
    for(int i=0;i<=n;i++) dis[i]=INT_MAX;
    dis[x]=0;
    q.push({0,x});
    while(q.size())
    {
        auto t=q.top(); q.pop();
        int u=t.second;
        if(vis[u]) continue;
        vis[u]=1;
        for(auto t:e[u])
        {
            int v=t.v,w=t.w;
            if(dis[v]>dis[u]+w) dis[v]=dis[u]+w;
            q.push({-dis[v],v});
        }
        
    }
}



signed main()
{
    
    cin>>n>>m>>x;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        e[u].push_back({v,w});
    }
    dijkstra(x);
    
    
}

标签:10005,int,短路,源点,dijkstra,dis
From: https://www.cnblogs.com/swjswjswj/p/18333293

相关文章

  • 次短路和第 k 短路
    次短路和第k短路次短路在最短路的基础上,次短路可以由次短路\(~+~\)边更新,也可以由最短路$~+~边更新,这里注意一点,因为次短路更新时也会对其它次短路产生影响,所以更新次短路时也需要入队,我们先尝试更新最短路,成功的话就把原来的最短路给次短路,不成功的话就单独尝试更新次短路......
  • 【变压器的短路试验】变压器的短路试验是通过将二次侧短路,并向一次侧施加额定电流来进
       ......
  • Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法
    第62天,完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★*,最后的两个算法学习,编程语言C++目录Floyd算法精讲A*算法精讲(Astar算法) A*算法 复杂度分析 A*算法的缺点最短路算法总结篇 图论总结深搜和广搜并查集最小生成树 拓扑排序 最短路算法 总结 Floyd算法精讲......
  • 代码随想录算法训练营第62天 | 最短路径:dijkstra(堆优化版)+ Bellman_ford算法
    47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(堆优化版)精讲https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#思路94.城市间货物运输Ihttps://kamacoder.com/problempage.php?pid=1152Bellman_ford算法精讲https://www.pr......
  • 关于最短路
    定义单源最短路:从一个点出发,到其他所有点的最短距离多源最短路:从图中任意一点出发,到其他所有点的最短距离记号\(n~\)为图上点的数目,\(m~\)为图上边的数目;\(s~\)为最短路的源点;\(D(u)~\)为\(~s~\)点到\(~u~\)点的实际最短路长度;\(~dis(u)~\)为s点到u点的估计最短......
  • 关于最短路
    定义单源最短路:从一个点出发,到其他所有点的最短距离多源最短路:从图中任意一点出发,到其他所有点的最短距离记号\(n~\)为图上点的数目,\(m~\)为图上边的数目;\(s~\)为最短路的源点;\(D(u)~\)为\(~s~\)点到\(~u~\)点的实际最短路长度;\(~dis(u)~\)为s点到u点的估计最短......
  • 最短路
    Floyd三方,顺序是\(k,i,j\),理由是我们定义的数组f[k][x][y],表示只允许经过结点\(1\)到\(k\)(也就是说,在子图\(V'={1,2,\ldots,k}\)中的路径,注意,\(x\)与\(y\)不一定在这个子图中),结点\(x\)到结点\(y\)的最短路长度,可以压掉一维。for(intk=1;k<=n;k++) for......
  • 【GeoScene】一、创建、发布路网服务,并在代码中测试最短路径分析
    前言网上关于GeoScene及GeoSceneAPIforJavaScript的资料太少了,官方的技术支持又太慢了,最近把在项目中踩过的坑分享出来;**版本信息**GeoScenePro4.0GeoSceneEnterprise3.1GeoSceneAPIforJavaScript4.27.4一、创建网络分析图层1、在地理数据库中新建......
  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • 最短路计数
    //最短路计数.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///**https://loj.ac/p/10077【题目描述】给出一个N个顶点M条边的无向无权图,顶点编号为1∼N。问从顶点1开始,到其他每个点的最短路有几条。输入格式第一行包含2个正整数N,M,为图的顶......