2 solutions

  • 1
    @ 2026-1-7 16:58:18

    先看一下题目。

    题目大致意思就是给你一个图,起点 ss,问你 ss 到各个点的最短路,即权值最小。

    于是想到了 dijstradijstra 算法。

    什么是 dijstradijstra

    dijstradijstra 算法基于广搜算法实现,主要是对边进行处理,其思想是每次处理最小的边,如果总权值比存的最短路小,则更新,并加入队列。

    注意:此图是个有向图!

    加了堆优化,时间复杂度 Θ(n+mlogm)\Theta(n + m \log m)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,s,dis[10005];
    struct joker{
        int v,val;
    };
    vector<joker> a[10005];
    struct node{
        int u,step;
    };
    priority_queue<node,vector<node> > q;
    bool operator<(node a,node b){
        return a.step>b.step;
    }
    void dijstra(){
        q.push({s,0});
        while(!q.empty()){
            node t=q.top();
            q.pop();
            int np=t.u;
            for(int i=0;i<a[np].size();i++){
                int v=a[np][i].v;
                if(dis[v]>dis[np]+a[np][i].val){
                    dis[v]=dis[np]+a[np][i].val;
                    q.push({v,dis[v]});
                }
            }
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0),cout.tie(0);
        cin>>n>>m>>s;
        while(m--){
            int u,v,w;
            cin>>u>>v>>w;
            a[u].push_back({v,w});
        }
        memset(dis,0x3f,sizeof(dis));
        dis[s]=0;
        dijstra();
        for(int i=1;i<=n;i++){
            if(dis[i]==0x3f3f3f3f) cout<<INT_MAX<<' ';
            else cout<<dis[i]<<' ';
        }
        return 0;
    }
    
    • -1
      @ 2025-10-4 15:59:13

      SPFA

      #include<bits/stdc++.h>
      using namespace std;
      void read(int &h){
          char o;
          int x=0,y=1;
          o=getchar_unlocked();
          while(!(o<='9'&&o>='0')){
              if(o=='-'){
                  y=-1;
              }
              o=getchar_unlocked();
          }
          while(o<='9'&&o>='0'){
              x*=10;
              x+=o-'0';
              o=getchar_unlocked();
          }
          h=x*y;
          return ;
      }
      const int N=5e5+10;
      int n,m,s,u,v,w;
      vector<int> g[N],dis[N];
      queue<int> q;
      bool vis[N];
      int len[N];
      void start(){
          for(int i=1;i<=n;i++){
              len[i]=INT_MAX;
          }
          len[s]=0;
          vis[s]=1;
          q.push(s);  
          return ;
      }
      int main(){
          ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
          read(n);read(m);read(s);
          start();
          for(int i=1;i<=m;i++){
              read(u);read(v);read(w);
              g[u].push_back(v);
              dis[u].push_back(w);
          }
          while(!q.empty()){
              int x=q.front();
              q.pop();
              vis[x]=0;
              for(int i=0;i<g[x].size();i++){
                  int now=g[x][i];
                  if(len[now]>len[x]+dis[x][i]){
      	 		    if(!vis[now]){
                          q.push(now);
                          vis[now]=true;
                      }
      			    len[g[x][i]]=len[x]+dis[x][i];
                  }
              }
          }
          for(int i=1;i<=n;i++){
              if(len[i]!=INT_MAX){
                  cout<<len[i];
              }
              else{
                  cout<<2147483647;
              }
              cout<<" ";
          }
          return 0;
      }
      
      
      • 1

      Information

      ID
      7401
      Time
      1000ms
      Memory
      125MiB
      Difficulty
      5
      Tags
      # Submissions
      224
      Accepted
      43
      Uploaded By