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

分层图;

我也不知道我写的是不是 bfs (dijkstra?)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,k,head[],ct,dis[][];
bool vis[][];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[];
struct P{
int d,f,bh;
P(int d=,int f=,int b=):d(d),f(f),bh(b) {}
bool operator < (const P &y) const
{
return d>y.d;//priority_queue 是从大到小排序
}
};
priority_queue<P>q;
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[][]=; q.push(P(,,));
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==n)
{
printf("%d",d);
return;
}
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(f<k&&!vis[u][f+]&&dis[u][f+]>d+edge[i].w/)
{
dis[u][f+]=d+edge[i].w/;
q.push(P(dis[u][f+],f+,u));
}
if(dis[u][f]>d+edge[i].w&&!vis[u][f])
{
dis[u][f]=d+edge[i].w;
q.push(P(dis[u][f],f,u));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
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 ;
}
05-11 18:30