1 条题解

  • 0
    @ 2026-6-17 1:47:19

    // 最短路条数 Dijkstra 算法 O(MlogN)
    #include<bits/stdc++.h>
    #define pii pair<int,int>
    using namespace std;
    
    const int N=2010,M=4e6;
    int h[N],to[M],ww[M],ne[M],idx;
    void add(int a,int b,int c){
      to[++idx]=b,ww[idx]=c,ne[idx]=h[a],h[a]=idx;
    }
    int n,m,g[N][N];
    int d[N],cnt[N];
    bool vis[N];
    
    void dijkstra(){
      memset(d,0x3f,sizeof d); d[1]=0; cnt[1]=1;
      priority_queue<pii,vector<pii>,greater<pii> > q; 
      q.push({0,1});
      while(!q.empty()){
        int u=q.top().second; q.pop();
        if(vis[u])continue; vis[u]=1;
        for(int i=h[u];i;i=ne[i]){
          int v=to[i],w=ww[i];
          if(d[v]>d[u]+w){ //如果1到v的距离可以变小
            d[v]=d[u]+w;
            cnt[v]=cnt[u]; //那就继承最短路条数
            q.push({d[v],v});
          }
          else if(d[v]==d[u]+w){  //如果1到v的距离相等
            cnt[v]=cnt[v]+cnt[u]; //那就累加最短路条数
          }
        }
      }
    }
    int main(){
      scanf("%d%d",&n,&m);
      for(int i=1,a,b,c;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        if(g[a][b]==c) continue; //去重边
        add(a,b,c); g[a][b]=c;
      }
      
      dijkstra();
      if(d[n]==0x3f3f3f3f)printf("No answer\n");
      else printf("%d %d\n",d[n],cnt[n]); 
    }
    
    • 1

    D100 最短路条数 Dijkstra 算法 P1608 路径统计

    信息

    ID
    12499
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    4
    上传者