54分求助
查看原帖
54分求助
490484
include13_fAKe楼主2023/8/11 10:45
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=114514;
int n,m,k;
int cnt;
struct node{
	int to;
	int dis;
	int next;
}edge[N*50];
int head[N];
void add(int a,int b,int c){//从 a 到 b ,价值为 c 
	cnt++;
	edge[cnt].dis=c;
	edge[cnt].to=b;
	edge[cnt].next=head[a];
	head[a]=cnt; 
}
int ans[N];
bool qd[N]; 
void dijkstra(int s,int t){
	memset(ans,0x3f3f3f3f,sizeof(ans));
	ans[s]=0;
	int u=s;
	while(1){
//		cout<<u<<' '<<ans[u]<<endl;
		qd[u]=true;
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].to;
			ans[v]=min(ans[v],ans[u]+edge[i].dis);
		}
		u=-1;
		int a=0x3f3f3f3f;
		for(int i=0;i<=k*n+n-1;i++){
			if(qd[i]==false&&ans[i]<a){
				a=ans[i];
				u=i;
			}
		}//找点 
		if(u==-1){
			printf("%lld\n",ans[t]);
			exit(0);
		}
	}
}
signed main(){
//	freopen("graph.in","r",stdin);
//	freopen("graph.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);
	int s,t;
	scanf("%lld%lld",&s,&t);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		for(int j=0;j<=k;j++){
			add(a+j*n,b+j*n,c);
			add(b+j*n,a+j*n,c);
		} 
		for(int j=0;j<k;j++){
			add(a+j*n,b+(j+1)*n,0);
			add(b+j*n,a+(j+1)*n,0);
		}
	}
	t=n*k+t;
//	cout<<t<<endl;
	dijkstra(s,t);
	return 0;
}
/*
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
*/
2023/8/11 10:45
加载中...