73pts求调(dijsktra)
查看原帖
73pts求调(dijsktra)
215817
gyc071116楼主2024/8/10 11:39
#include<bits/stdc++.h>
#define MAXN (10000*11+5)
using namespace std;
int h[MAXN],path[MAXN],etot;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
struct ee{
	int u;
	int w;
	int next;
}edge[30*MAXN];
void add_edge(int x,int y,int val){
	edge[etot]=(ee){y,val,h[x]};
	h[x]=etot++;
}
int main(){
	int n,m,k,s,t;
	scanf("%d %d %d",&n,&m,&k);
	scanf("%d %d",&s,&t);
	for(int i=0;i<=n*(k+1)-1;i++){
		h[i]=-1;
		path[i]=0x3f3f3f3f;
	}
	path[s]=0;
	int a,b,c;
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&a,&b,&c);
		for(int i=0;i<=k;i++){
			add_edge(a+i*n,b+i*n,c);
			add_edge(b+i*n,a+i*n,c);
		}
		for(int i=1;i<=k;i++){
			add_edge(a+(i-1)*n,b+i*n,0);
		}
	}
	for(int i=1;i<=k;++i) add_edge(t+(i-1)*n,t+i*n,0);
	q.push(make_pair(s,path[s]));
	int Node,Path;
	while(!q.empty()){
		Node=q.top().first;
		Path=q.top().second;
		q.pop();
		if(Path==path[Node]){
			for(int i=h[Node];i!=-1;i=edge[i].next){
				if(path[edge[i].u]>Path+edge[i].w){
					path[edge[i].u]=Path+edge[i].w;
					q.push(make_pair(edge[i].u,path[edge[i].u]));
				}
			}
		}
	}
	printf("%d",path[n*k+t]);
	return 0;
}
2024/8/10 11:39
加载中...