73分大佬求助!!!
查看原帖
73分大佬求助!!!
629342
xlaser楼主2023/11/7 22:01
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

struct edge
{
	int v,w;
};

struct node
{
	int val,id;
	friend bool operator<(node x,node y)
	{
		return x.val>y.val;
	}
};

int n,m,k;
int s,t;
vector<edge> e[500010];
int dis[500010],cnt[500010];
int ans=1e9;

void dijkstra(int s)
{
	memset(dis,0x3f,sizeof(dis));
	priority_queue<node> q;
	bool vis[500010];
	bool vis2[500010];
	q.push(node{0,s});
	while(!q.empty())
	{
		auto tmp=q.top();
		q.pop();
		int mini=tmp.id;
		int jl=tmp.val;
		if(vis[mini])
		{
			continue;
		}
		vis[mini]=true;
		for(int i=0;i<e[mini].size();i++)
		{
			if(dis[e[mini][i].v]>e[mini][i].w+jl)
			{
				dis[e[mini][i].v]=e[mini][i].w+jl;
				q.push(node{dis[e[mini][i].v],e[mini][i].v});
			}
		}
	}
}

int main()
{
	cin>>n>>m>>k>>s>>t;
	s++;
	t++;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		a++;
		b++;
		e[a].push_back({b,c});
		e[b].push_back({a,c});
		for(int j=1;j<=k;j++)
		{
			e[a+(j-1)*n].push_back({b+j*n,0});
			e[a+j*n].push_back({b+j*n,c});
			e[b+j*n].push_back({a+j*n,c});
		}
	}
	dijkstra(s);
	for(int i=0;i<=k;i++)
	{
		ans=min(ans,dis[t+i*n]);
	}
	cout<<ans;
	return 0;
}
2023/11/7 22:01
加载中...