P4568 [JLOI2011] 飞行路线
考虑跑多层图,每层图连条边权为0的边,跑 dijkstra 即可。
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e7+10; int n,m,k,s,t; int cnt; int head[N]; struct ss{ int to,w,next; }a[N]; void add(int u,int v,int w){ a[cnt].to=v; a[cnt].w=w; a[cnt].next=head[u]; head[u]=cnt++; } struct no{ int id,di; bool operator < (const no &g) const { return di>g.di; } }; int dis[N]; int vis[N]; priority_queue<no> q; void dijkstra(int x){ memset(dis,0x3f,sizeof dis); dis[x]=0; q.push({x,0}); while(!q.empty()){ no u=q.top(); q.pop(); if(vis[u.id]){ continue; } vis[u.id]=1; for(int i=head[u.id];~i;i=a[i].next){ int y=a[i].to; if(vis[y]){ continue; } if(dis[y]>dis[u.id]+a[i].w){ dis[y]=dis[u.id]+a[i].w; q.push({y,dis[y]}); } } } } int main(){ ios::sync_with_stdio(false); cin>>n>>m>>k>>s>>t; memset(head,-1,sizeof head); for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; add(u,v,w); add(v,u,w); for(int j=1;j<=k;j++){ add(u+(j-1)*n,v+j*n,0); add(v+(j-1)*n,u+j*n,0); add(u+j*n,v+j*n,w); add(v+j*n,u+j*n,w); } } for(int i=1;i<=k;i++){//题解上写的,防止负权边 add(t+(i-1)*n,t+i*n,0); } dijkstra(s); cout<<dis[t+k*n]; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」