最短路

  • for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
    传递闭包
    for(int k=0;k<n;k++)
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    dp[i][j]|=dp[i][k]&dp[k][j];
    or
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    for(int k=0;k<n;k++)
    dp[i][j]=dp[i][k]|dp[k][j];
  • struct E{int v,w;};
    bool operator <(E a,E b){return a.w>b.w;}
    vector<E>g[N];
    void dij(int s)
    {
       for(int i=1;i<=n;i++)vis[i]=0,dis[i]=oo;
       priority_queue<E>dp;
       dis[s]=0;
       dp.push((E){s,0});
       while(!dp.empty())
       {
           E node=dp.top();
           dp.pop();
           int u=node.v;
           if(vis[u])continue;
           vis[u]=1;
           for(E e:g[u])
           {
               if(!vis[e.v] and dis[e.v]>dis[u]+e.w)
               {
                   dis[e.v]=dis[u]+e.w;
                   dp.push((E){e.v,dis[e.v]});
               }
           }
       }
    }
  • int dis[N];
    bool vis[N];
    void spfa(int s){
      for(int i=1;i<N;i++)dis[i]=oo,vis[i]=true;
      dis[s]=0;
      queue<int>q;
      q.push(s);
      vis[s]=true;
      while(!q.empty()){
          int u=q.front();
          q.pop();
          vis[u]=true;
          for(int i=head[u];~i;i=g[i].next){
              int v=g[i].to;
              if(dis[u]+g[i].w<dis[v]){
                  dis[v]=dis[u]+g[i].w;
                  if(vis[v])q.push(v),vis[v]=false;
              }
          }
      }
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
简历当中有水分算不算造假...
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务