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
原文地址:https://www.cnblogs.com/shuguangzw/p/5323678.html