首页 > 其他分享 >最短路

最短路

时间:2023-12-07 23:25:26浏览次数:29  
标签:int ed 短路 vis dijkstra push


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

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

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

朴素dij:

int n,m,s,a,b,c;
const int N=100010;
struct edge{int v,w;};
vector<edge> e[N];
int d[N], vis[N];

void dijkstra(int s){
  for(int i=0;i<=n;i++)d[i]=inf;
  d[s]=0;
  for(int i=1;i<n;i++){//枚举次数
    int u=0;
    for(int j=1;j<=n;j++)//枚举点
      if(!vis[j]&&d[j]<d[u]) u=j;
    vis[u]=1; //标记u已出圈 
    for(auto ed:e[u]){//枚举邻边
      int v=ed.v, w=ed.w;
      if(d[v]>d[u]+w){
        d[v]=d[u]+w;
      } 
    }
  } 
}
int main(){
  cin>>n>>m>>s;
  for(int i=0; i<m; i++){
    cin>>a>>b>>c;
    e[a].push_back({b,c});
  }
  dijkstra(s);
  for(int i=1;i<=n;i++)
    printf("%d ",d[i]);  
  return 0;
}

堆优化版dij

//堆优化Dijkstra 

#define pii pair<int,int>
const int N=100010;
int n,m,s,a,b,c;
struct edge{int v,w;};
vector<edge> e[N];
int d[N],vis[N];

void dijkstra(int s){
  memset(d,0x3f,sizeof d); d[s]=0; 
  priority_queue<pii,vector<pii>,greater<pii>> q;
  q.push({0,s});
  while(q.size()){
    auto t=q.top(); q.pop();
    int u=t.second;
    if(vis[u])continue; //再进队就直接跳过
    vis[u]=1; //标记u已出队
    for(auto ed : e[u]){
      int v=ed.v, w=ed.w;
      if(d[v]>d[u]+w){
        d[v]=d[u]+w;
        q.push({d[v],v}); //小根堆
      }
    }
  }
}
int main(){
  cin>>n>>m>>s;
  for(int i=0; i<m; i++)
    cin>>a>>b>>c, e[a].push_back({b,c});
  dijkstra(s);//虽然有重边和正环,但是vis数组保证了正确性
  for(int i=1;i<=n;i++) printf("%d ",d[i]); 
}

最简单处理带负权边的最短路

void floyd()
{

    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
init(){
 for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            if (i == j) d[i][j] = 0;
            else d[i][j] = INF;
}
存边方式: d[a][b] = min(d[a][b], w);
# 如果是无向边需要加d[b][a]

标签:int,ed,短路,vis,dijkstra,push
From: https://www.cnblogs.com/mathiter/p/17884223.html

相关文章

  • Java逻辑运算符,短路运算
     短路运算 因为c=5,所以c<4为false,又因为逻辑与运算,只要出现一个false就会输出所以booleand=(c<4)&&(c++<4);这行代码直接会输出false,(c++<4)也不会被执行所以输出的结果为false,c=5,而不是c=6.-----------------------------------------------------------------------......
  • 路径规划算法 - 求解最短路径 - Dijkstra算法
    Dijkstra算法的思想是广度优先搜索(BFS)贪心策略。是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数如果是负数,则需要Bellman-Ford算法如果想求任意两点之间的距离,就需要用Floyd算法求节点0->4的最短路径每次从未标记的节点中选择距离......
  • 求最短路径迪杰斯特拉算法
    代码运行截图:完整代码:#include<stdio.h>#include<stdlib.h>#defineMaxSize20#defineMAX999typedefstructArcNode{//边表intadjvex;//边表中是顶点号!!structArcNode*next;intweight;}ArcNode;typedefstructVN......
  • 最短路
    1.稠密图用邻接矩阵来存朴素版dijkstra算法acwing8491#include<bits/stdc++.h>2usingnamespacestd;34constintN=510;5intn,m;6intdis[N];//每个点到起点的最短距离(路)7intg[N][N];//稠密图邻接矩阵来存8boolst[N];//该集合表示状态,表......
  • P3371 【模板】单源最短路径
    【模板】单源最短路径(标准版)题目背景2018年7月19日,某位同学在NOIDay1T1归程一题里非常熟练地使用了一个广为人知的算法求最短路。然后呢?\(100\rightarrow60\);\(\text{Ag}\rightarrow\text{Cu}\);最终,他因此没能与理想的大学达成契约。小F衷心祝愿大家不再......
  • 对第K短路一题的一些解释
    首先证明那个比较显然的推论我们先证明一下一个小引理:这个BFS先出队的点一定比后出队的点的代价小或等于用数学归纳法,假设前面已经出队的点满足以上性质,之前最后一个出队的点为\(x\),现在队列里面的队首是\(y\),那我们就是要证明\(y\)的代价比\(x\)小或等于我们考虑一下\(y\)是怎......
  • 重要的保护:BOSHIDA DC电源模块短路保护
    重要的保护:BOSHIDADC电源模块短路保护DC电源模块是实验室和工业中非常常见的电源,它能够提供稳定的电压和电流输出,以满足各种设备和电路的需求。然而,如果DC电源模块没有短路保护,它可能会对所连接的仪器和设备造成损害,甚至引起火灾等严重后果。因此,在设计和制造DC电源模块时,短路保......
  • dijkstra跑全源最短路
     跑n次voiddijk(){ for(inti=1;i<=n;i++) for(intj=1;j<=n;j++)d[i][j]=inf; priority_queue<pii,vector<pii>,greater<pii>>q; for(intS=1;S<=n;S++){ q.push(pii(0,S)); for(inti=1;i<=n;i++)......
  • 最短路
    Dijkstra算法#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllinf=1e18+10;vector<pair<ll,ll>>G[100000+10];lln,m,s,d[100000+10];boolvis[100000+10];voiddijkstra(){ priority_queue<pair<ll,ll>,vec......
  • 图- 最短路径
    图的最短路径最小生成树与最短路径最小生成树包含图中的所有点。能保证整个树中的所有路径之和最小。最短路径不一定包含图中的所有结点。(有向图,部分结点无法以最短路方式被加入)能保证从一点到图中其他点的路径最小。Dijkstra迪杰斯特拉算法Dijkstra按路径长度递增的......