题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763

构建分层图。

代码如下:

写法1(空间略大)(时间很慢):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<pair<int,int> >q;
int const maxn=2e5+,maxm=;
int n,m,k,s,t,head[maxn],ct,dis[maxn];
bool vis[maxn];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxm<<];
void add(int x,int y,int z)
{
edge[++ct]=N(y,head[x],z); head[x]=ct;
edge[++ct]=N(x,head[y],z); head[y]=ct;
for(int i=;i<=k-;i++)
{
int u=x+i*n,v=y+(i+)*n;
edge[++ct]=N(v,head[u],); head[u]=ct;
u=y+i*n,v=x+(i+)*n;
edge[++ct]=N(v,head[u],); head[u]=ct;
u=x+(i+)*n,v=y+(i+)*n;
edge[++ct]=N(v,head[u],z); head[u]=ct;
edge[++ct]=N(u,head[v],z); head[v]=ct;
}
}
void dijkstra()
{
memset(dis,0x3f,sizeof dis);
dis[s]=; q.push(make_pair(,s));
while(q.size())
{
int x=q.top().second; q.pop();
while(vis[x]&&q.size())x=q.top().second,q.pop();
if(vis[x])break; vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
q.push(make_pair(-dis[u],u));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
t+=k*n;
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra();
printf("%d",dis[t]);
return ;
}

写法2(空间小)(时间飞快)(bfs)(dijkstra?):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int const maxn=,maxm=;
struct P{
int bh,d,f;
P(int b=,int d=,int f=):bh(b),d(d),f(f) {}
bool operator < (const P &y) const
{
return d>y.d;//priority_queue 是从大到小排序
}
};
priority_queue<P>q;
int n,m,K,head[maxn],ct,s,t,dis[maxn][];
bool vis[maxn][];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxm<<];
void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
void bfs()
{
memset(dis,0x3f,sizeof dis);
dis[s][]=; q.push(P(s,,));
while(q.size())
{
int x=q.top().bh, d=q.top().d, f=q.top().f; q.pop();
if(vis[x][f])continue;
vis[x][f]=;
if(x==t)
{
printf("%d",d); return;
}
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(f<K&&dis[u][f+]>d&&!vis[u][f+])
{
dis[u][f+]=d;
q.push(P(u,d,f+));
}
if(dis[u][f]>d+edge[i].w&&!vis[u][f])
{
dis[u][f]=d+edge[i].w;
q.push(P(u,dis[u][f],f));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&K,&s,&t);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
bfs();
return ;
}

最新文章

  1. VirtualBox piix4_smbus Error
  2. REDIS源码中一些值得学习的技术细节01
  3. UITableView代理方知多少+执行顺序
  4. LINUX查看系统日志
  5. 【hadoop2.6.0】通过代码运行程序流程
  6. 【发问】代表ODBC、Ibatis 发问 Hibernate、Linq、Entity、JPA
  7. 从头到尾彻底解析Hash表算法
  8. Centos定时任务
  9. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
  10. python3元组
  11. CF747F Igor and Interesting Numbers
  12. !! zcl_TD 用法注释02 力攻(动能&lt;4)
  13. vue 导出excel表格
  14. 解析swf文件头,获取flash的原始尺寸
  15. Path画直线与弧线
  16. Airlaunch 快捷设置代码分享
  17. Xcode提交图片出错:Commit failed not under version control (1)
  18. 理解SQL SERVER中的逻辑读,预读和物理读
  19. FocusBI: SSIS 开发案例(原创)
  20. 漫漫征途,java开发(未完待续)

热门文章

  1. 有向图连通分量SCC
  2. Spring核心技术(六)——Spring中Bean的生命周期
  3. 移动Web解决方案的链接收藏
  4. Dijkstra算法C++实现总结
  5. UVALive 6430 (水dp)
  6. noip模拟赛 斐波那契
  7. codevs——1019 集合论与图论
  8. oracle链接不上的问题
  9. idea中javaweb的mysql8.0.15配置问题
  10. Ubuntu 16.04 GNOME下解决Sublime Text3中文输入(ibus)(转)