比赛 2024暑假C班集训A 评测结果 AAAAAAAAAA
题目名称 行动!行动! 最终得分 100
用户昵称 小金 运行时间 0.199 s
代码语言 C++ 内存使用 4.67 MiB
提交时间 2024-07-10 11:52:15
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int h[10010],tot,n,m,s,t,k;
int dis[10010][15],ans=0x3f3f3f3f,vis[10010][15];
struct cod{
    int u,v,w;
}e[200010];
struct coc{
	int u,d,used;
	bool operator <(const coc&a) const 
	{
		return d>a.d;
	}
};
void add(int x,int y,int z)
{
    tot++;
	e[tot].u=h[x];
	e[tot].v=y;
	e[tot].w=z;
	h[x]=tot;
}
void dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	dis[s][0]=0;
	priority_queue<coc>q;
	q.push((coc){s,0,0});
	while(!q.empty())
	{
		int u=q.top().u;
        int now=q.top().used;
		q.pop();
		if(vis[u][now]) continue;
		vis[u][now]=1;
		for(int i=h[u];i;i=e[i].u)
		{
		    int y=e[i].v;
			if(now<k&&!vis[y][now+1]&&dis[y][now+1]>dis[u][now])
			{
				dis[y][now+1]=dis[u][now];
				q.push((coc){y,dis[y][now+1],now+1});
			}
			if(!vis[y][now]&&dis[y][now]>dis[u][now]+e[i].w)
			{
				dis[y][now]=dis[u][now]+e[i].w;
				q.push((coc){y,dis[y][now],now});
			}
		}
	}
}
int main()
{
    freopen("move.in","r",stdin);
    freopen("move.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
    scanf("%d%d",&s,&t);
	s++;
    t++;
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		x++;
        y++;
		add(x,y,z);
		add(y,x,z);
	}
	dijkstra();
	for(int i=0;i<=k;i++)
	{
		ans=min(ans,dis[t][i]);
    }
	printf("%d",ans);
}