1 条题解

  • 0
    @ 2026-6-18 0:44:38

    // 最短路树 dijkstra 算法 O(MlogN)
    #include<bits/stdc++.h>
    #define int long long
    #define pii pair<int,int>
    using namespace std;
    
    const int N=3e5+5;
    int h[N],to[N<<1],ww[N<<1],ne[N<<1],idx;
    void add(int u,int v,int w){
      to[++idx]=v;ww[idx]=w;ne[idx]=h[u];h[u]=idx;
    }
    int n,m,k,sum,d[N],pre[N]; bool 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.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){
            d[v]=d[u]+w;
            pre[v]=i; //保存前驱边
            q.push({d[v],v});
          }
        }
      }
    }
    void dfs(int u,int fa){ //输出与根节点相连的最短路径树上的k条边
      if(sum==k) exit(0);
      for(int i=h[u]; i; i=ne[i]){
        int v=to[i];
        if(v==fa) continue;
        if(pre[v]==i){
          ++sum;
          printf("%lld ",(i+1)/2);
          dfs(v,u);
        }
      }
    }
    signed main(){
      scanf("%lld%lld%lld",&n,&m,&k);
      for(int i=1,a,b,c; i<=m; ++i){
        scanf("%lld%lld%lld",&a,&b,&c);
        add(a,b,c),add(b,a,c);
      }
      
      dijkstra(1);
      printf("%lld\n",min(n-1,k));
      dfs(1,0);
    }
    
    • 1

    D93 最短路径树 Dijkstra 算法 CF1076D Edge Deletion

    信息

    ID
    12502
    时间
    2000ms
    内存
    300MiB
    难度
    10
    标签
    递交数
    7
    已通过
    3
    上传者