算法:分层图
难度:NOIP
还是易见分层图,跑一跑就好了,根据上一道题留下的坑,我写出了DP的分层图。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <deque>
#include <algorithm>
#define N 50005
using namespace std;
struct node
{
int next;
int to;
int val;
}edge[N<<1];
int head[N],dis[N][15],vis[N][15];
int cnt=1;
void init()
{
memset(head,-1,sizeof(head));
cnt=1;
}
void add(int u,int v,int w)
{
edge[cnt].next=head[u];
edge[cnt].to=v;
edge[cnt].val=w;
head[u]=cnt++;
}
struct no
{
int po;
int d;
int f;
};
priority_queue<no>Q;
bool operator < (no a,no b)
{
return a.d>b.d;
}
int sta,des;
int n,m,k;
void dijks(int rt)
{
memset(dis,0x3f3f3f3f,sizeof(dis));
no p;
p.po=rt;
p.d=0;
p.f=0;
dis[rt][0]=0;
Q.push(p);
while(!Q.empty())
{
no tem=Q.top();
Q.pop();
int f=tem.f;
if(vis[tem.po][f]) continue;
vis[tem.po][f]=1;
int u=tem.po,d=tem.d;
if(u==des)
{
printf("%d\n",tem.d);
exit(0);
}
for(int i = head[u];i != -1;i=edge[i].next)
{
int to=edge[i].to;
no pp;
if((f<k)&&(!vis[to][f+1])&&(dis[to][f+1]>d))
{
dis[to][f+1]=d;
pp.po=to;
pp.d=d;
pp.f=f+1;
Q.push(pp);
}
if(!vis[to][f]&&dis[to][f]>d+edge[i].val);
{
dis[to][f]=d+edge[i].val;
pp.po=to;
pp.d=dis[to][f];
pp.f=f;
Q.push(pp);
}
}
}
}
int main()
{
init();
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&sta,&des);
for(int i = 1;i <= m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dijks(sta);
return 0 ;
}