[USACO09FEB]Revamping Trails G——分层图最短路
用
题面
约翰一共有 个牧场.由 条布满尘埃的小径连接。小径可以双向通行。每天早上约翰从牧场 出
发到牧场 去给奶牛检查身体。
通过每条小径都需要消耗一定的时间。约翰打算升级其中 条小径,使之成为高速公路。在高速公路上
的通行几乎是瞬间完成的,所以高速公路的通行时间为 。
请帮助约翰决定对哪些小径进行升级,使他每天从 号牧场到第 号牧场所花的时间最短。
思路
裸的分层图
正边权的图,记得用,记得用,卡卡到你哭
注意
我们还需要在相邻两层图之间的终点连边
解释见代码
for(int i=1;i<=k;i++)
add(n+(i-1)*n,n+i*n,0);//防止毒瘤数据,k 次机会还没用完就到终点了
代码
#include<bits/stdc++.h>
using namespace std;
const int N=6e6;
int ne[N],ver[N],e[N],idx,head[N];
int n,m,k;
void add(int u,int v,int w)
{
ver[idx]=v;
ne[idx]=head[u];
e[idx]=w;
head[u]=idx;
idx++;
}
typedef pair<int,int> PII;
long long dist[N];
bool vis[N];
void dij(int s)
{
memset(dist,0x3f,sizeof(dist));
dist[s]=0;
vis[s]=0;
priority_queue<PII ,vector<PII > ,greater<PII > > q;
q.push({0,s});
while(q.size())
{
PII t=q.top();
q.pop();
int x=t.second;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i!=-1;i=ne[i])
{
int j=ver[i];
if(dist[j]>dist[x]+e[i])
{
dist[j]=dist[x]+e[i];
q.push({dist[j],j});
}
}
}
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
for(int j=1;j<=k;j++)
{
add(a+(j-1)*n,b+j*n,0);//岔开进行加边,因为我们加了零边之后,我们的程序可定会选择走零边,所以就相当于我们让一条边的权值变成了0
add(b+(j-1)*n,a+j*n,0);//相同的操作
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
}
}
for(int i=1;i<=k;i++)
add(n+(i-1)*n,n+i*n,0);//防止毒瘤数据,k 次机会还没用完就到终点了
dij(1);
cout<<dist[n+n*k]<<endl;
return 0;
}
本文作者:邦的轩辕
本文链接:https://www.cnblogs.com/bangdexuanyuan/p/13934237.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?