• HDU4725 The Shortest Path in Nya Graph dij


    分析:对于每一层,原来n个点,然后扩展为原来的三倍,每一层扩展一个入点,一个出点,然后跑最短路

    注:tmd我把一个n写成m了,然后wa了7次,我都要怀疑人生了

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    const int N=1e5+5;
    const int INF=0x3f3f3f3f;
    struct Edge{
       int v,w,next;
       bool operator<(const Edge &e)const{
          return w>e.w;
       } 
    }edge[N*20];
    int head[N*3],tot,n,m,c,d[N*3];
    void add(int u,int v,int w){
       edge[tot].v=v;
       edge[tot].w=w;
       edge[tot].next=head[u];
       head[u]=tot++;
    }
    priority_queue<Edge>q;
    bool vis[N*3];
    int dij(int s,int t){
        for(int i=1;i<=n;++i)d[i]=INF,vis[i]=0;
        d[s]=0,q.push(Edge{s,0,0});
        while(!q.empty()){
           while(!q.empty()&&vis[q.top().v])q.pop();
           if(q.empty())break;
           int u=q.top().v;
           q.pop();
           vis[u]=1;
           for(int i=head[u];~i;i=edge[i].next){
              int v=edge[i].v;
              if(!vis[v]&&d[v]>d[u]+edge[i].w){
                d[v]=d[u]+edge[i].w;
                q.push(Edge{v,d[v],0});
              }
           } 
        }
        return d[t]==INF?-1:d[t];
    }
    vector<int>g[N];
    int main(){ 
        int T,cas=0;
        scanf("%d",&T);
        while(T--){
           scanf("%d%d%d",&n,&m,&c);
           for(int i=1;i<=n;++i)g[i].clear();
           for(int i=1;i<=n;++i){
            int x;
            scanf("%d",&x);
            g[x].push_back(i);
           }
           memset(head,-1,sizeof(head));
           tot=0;
           for(int i=1;i<=m;++i){
             int u,v,w;
             scanf("%d%d%d",&u,&v,&w);
             add(u,v,w),add(v,u,w);
           }
           for(int i=1;i<=n;++i){
            if(!g[i].size())continue;
            if(i>1&&g[i-1].size())
              add(n+i,2*n+i-1,c);
            if(i<n&&g[i+1].size())
              add(n+i,2*n+i+1,c);
             for(int j=0;j<g[i].size();++j)
                add(g[i][j],i+n,0),add(i+2*n,g[i][j],0);
           }
           n*=3;
           printf("Case #%d: %d
    ",++cas,dij(1,n/3));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    音乐播放器
    对象的单体模式和面向对象
    箭头函数详解及this指向
    ES6的基础语法
    房贷灵活计算器
    [译文] SQL JOIN,你想知道的应该都有
    [Perl] 删除数组中重复元素
    [Qt] 自定义 滚动条 样式
    nodejs之异步思想
    导致人生失败的31种原因(转自csdn博客)
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5323678.html
Copyright © 2020-2023  润新知