救命啊QwQ
查看原帖
救命啊QwQ
239164
Meteorshower_Y楼主2022/4/10 20:16
#include<iostream>
#include<cstring>
#include<climits>
#include<cstdio>
#include<queue>
using namespace std;
struct edge
{
	int from,to;
	int dis;
	int next;
}a[100010];
struct node
{
	int from,c,dis;
	friend bool operator>(node a,node b){
		return a.dis<b.dis;
	}
	friend bool operator<(node a,node b){
		 return a.dis>b.dis;
	}
};
int n,m,k,s,t,u,v,w,ans=INT_MAX;
int head[10010],cnt;
int dis[15][10010];
bool vis[15][10010];
inline void add_edge(int from,int to,int dis)
{
	cnt+=1;
	a[cnt].from=from;
	a[cnt].to=to;
	a[cnt].dis=dis;
	a[cnt].next=head[from];
	head[from]=cnt;
}
inline void dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	queue<node> q;
	q.push((node){s,0,0});
	dis[0][s]=0;
	node x;
	int from,to,now;
	while(!q.empty())
	{
		x=q.front();
		q.pop();
		now=x.c, from=x.from;
		if(vis[now][from]) continue;
		vis[now][from]=true;
		for(int i=head[from];i;i=a[i].next)
		{
			to=a[i].to;
			if(now<k&&dis[now+1][to]>dis[now][from]) //免费的 
			{
				dis[now+1][to]=dis[now][from];
				q.push((node){to,now+1,dis[now+1][to]});
			}
			if(dis[now][to]>dis[now][from]+a[i].dis) //花钱的 
			{
//				cout<<from<<" -->"<<to<<endl;
				dis[now][to]=dis[now][from]+a[i].dis;
				q.push((node){to,now,dis[now][to]});
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d",&s,&t);
	s+=1,t+=1;
	for(int i=1;i<=m;i+=1)
	{
		scanf("%d%d%d",&u,&v,&w);
		u+=1,v+=1;
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	dijkstra();
	for(int i=0;i<=k;i+=1)
		ans=min(ans,dis[i][t]);
	printf("%d",ans);
	return 0;
}
2022/4/10 20:16
加载中...