题意:N个点,每个点有一个层号L,相邻的两层 Li 与 Li+1 之间的距离为C。另外给出M条无向边,求从点1到点N的最短路。

分析:同一层之间的两点距离并不是0,这是一个小坑。依次把相邻两层的所有点连边会导致复杂度很高。可以将每一层看作一个点,但是把它和层中的点连边会导致同层的两点距离为0。

为了避免这种情况,可以将每层拆作两点,表示入点和出点。所以所建图中一共有3N个点。1~N为原图中的点,N+1~2*N为每层出点,2*N+1~3*N为每层入点。对每个在该层中的点u,将其连至出点N+i;再将入点2N+i连至u。再将相邻两层的出点入点对应连接。最后跑一下Dijkstra。

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 3e5+;
const LL INF = 1ll<<;
struct Edge{
int to,next;
LL val;
};
struct HeapNode{
LL d; //费用或路径
int u;
bool operator < (const HeapNode & rhs) const{return d > rhs.d;}
};
struct Dijstra{
int n,m,tot;
Edge edges[maxn<<];
bool used[maxn];
LL d[maxn];
int head[maxn]; void init(int n){
this->n = n;
this->tot=;
memset(head,-,sizeof(head));
} void Addedge(int u,int v ,LL dist){
edges[tot].to = v;
edges[tot].val = dist;
edges[tot].next = head[u];
head[u] = tot++;
} void dijkstra(int s){
memset(used,,sizeof(used));
priority_queue<HeapNode> Q;
for(int i=;i<=n;++i) d[i]=INF;
d[s]=;
Q.push((HeapNode){,s});
while(!Q.empty()){
HeapNode x =Q.top();Q.pop();
int u =x.u;
if(used[u])
continue;
used[u]= true;
for(int i=head[u];~i;i=edges[i].next){
Edge & e = edges[i];
if(d[e.to] > d[u] + e.val){
d[e.to] = d[u] +e.val;
Q.push((HeapNode){d[e.to],e.to});
}
}
}
}
}G; int lay[maxn]; //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,M,T,u,v,cas=;
LL tmp,C;
scanf("%d",&T);
while(T--){
scanf("%d%d%lld",&N,&M,&C);
G.init(*N);
for(int i=;i<=N;++i){
scanf("%d",&tmp);
G.Addedge(i,tmp+N,); //1~N为层,N~2*N为出点,2*N~3*N为入点
G.Addedge(tmp+*N,i,);
}
for(int i=;i<=N-;++i){
G.Addedge(N+i,*N+i+,C); //将相邻两层出点入点对应连接
G.Addedge(N+i+,*N+i,C);
}
for(int i=;i<=M;++i){
scanf("%d%d%lld",&u,&v,&tmp);
G.Addedge(u,v,tmp);
G.Addedge(v,u,tmp);
}
G.dijkstra();
if(G.d[N]==INF) G.d[N]=-;
printf("Case #%d: %lld\n",cas++,G.d[N]);
}
return ;
}

最新文章

  1. 重载运算符:类成员函数or友元函数
  2. 常见HTTP状态码
  3. VTK初学一,a Mesh from vtkImageData—球冠
  4. elastic search 配置问题
  5. 设计师必备!免费下载 PSD 素材的32个网站
  6. 解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
  7. 安装mysql问题
  8. cocos2dx搭建开发环境
  9. 全新的手势,侧滑返回、全局右滑返回都OUT啦!
  10. C++中各种&lt;string,T&gt;关联方式的速度对比
  11. objective-C: nonatomic retain copy assgin 等属性详解
  12. .Net程序员 Solr-5.3之旅 (三)Solr 从MSSQ导入索引数据
  13. mybatis重拾---部署官方demo
  14. Android ---------- 清单文件中Activity常规设置
  15. vlc-android对于通过Live555接收到音视频数据包后的处理分析
  16. Activity与Service之间交互并播放歌曲的实现代码
  17. oracle sql 树操作
  18. [LeetCode] Largest Number At Least Twice of Others 至少是其他数字两倍的最大数
  19. 【BZOJ 3561】 DZY Loves Math VI
  20. vue+elementUI+axios实现的全局loading加载动画

热门文章

  1. 转:Socket服务器整体架构概述
  2. 那些在BAE上部署node.js碰到的坑
  3. Imageview如何设置背景颜色
  4. Android FragmentActivity 给Fragment传值
  5. java enum(枚举)使用详解 + 总结(转载)
  6. quartz 防止上一任务未执行完毕,下一时间点重复执行
  7. Zabbix监控Windows主机
  8. Storm-源码分析-Topology Submit-Worker
  9. 【opencv】ubuntu opencv imshow()报错
  10. RESTful HTTP的实践(转)