90分求助
查看原帖
90分求助
749959
the_night楼主2022/9/27 16:46
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=pow(2,31)-1;
ll n,m,k;
ll s,t;
ll dis[2000100],vis[2000100];
struct list{
	ll to,nxt,value,h;
}edge[2000100];
ll cnt=0;
void add(ll a,ll b,ll c){
	edge[++cnt].to=b;
	edge[cnt].value=c;
	edge[cnt].nxt=edge[a].h;
	edge[a].h=cnt;
}
struct node{
	ll v,dis;
	friend bool operator<(node a,node b){
		return a.dis>b.dis;
	}
};
priority_queue<node>q;
void dijkstra(){
	for(ll i=0;i<=(n-1)+k*n;i++){
		dis[i]=inf;
	}
	dis[s]=0;
	q.push(node{s,0});
	while(!q.empty()){
		ll u=q.top().v;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(ll i=edge[u].h;i;i=edge[i].nxt){
			ll v=edge[i].to;
			if(dis[v]>(ll)dis[u]+edge[i].value){
				dis[v]=dis[u]+edge[i].value;
				q.push(node{v,dis[v]});
			}		
		}
	}
}
int main(){
	cin>>n>>m>>k;
	cin>>s>>t;
	for(ll i=1,a,b,c;i<=m;i++){
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
		for(ll j=1;j<=k;j++){
			add(a+j*n,b+j*n,c);
			add(b+j*n,a+j*n,c);
			add(a+j*n-n,b+j*n,0);
			add(b+j*n-n,a+j*n,0);
		}
	}
	dijkstra();
	ll ans=inf;
	for(ll i=0;i<=k;i++){
		ans=min(ans,dis[t+i*n]);
	}
	cout<<ans;
	return 0;
} 
2022/9/27 16:46
加载中...