分层图dij 求调
查看原帖
分层图dij 求调
802664
BYR_KKK楼主2023/11/8 20:23

rt,实在调不出来了/kk


#include<bits/stdc++.h>
#define int long long
#define pii std::pair<int,int>
#define fi first
#define se second 
#define mk(P,Q) std::make_pair((P),(Q)) 

const int maxn=1e4+10,maxk=15;

const int maxnk=maxn*maxk;

int n,m,k,s,t;

//(k+1) 层的分层图  目标:s -> 每一行的 t(对于第 i 行,这一行的 t 为 i*n+t)

std::vector<pii>a[maxnk]; 

int dis[maxnk];

bool vis[maxnk];

std::priority_queue<pii,std::vector<pii>,std::greater<pii> >q;

int num(int x,int y){//第 x 行 第 y 个 点 
	return (x-1)*n+y;
}

//每层图中连边,上下也要连边 

void edge(int u,int v,int w){//连边 
	a[u].push_back(mk(v,w));
	a[v].push_back(mk(u,w));
	return ;
}

void push(int p){
	q.push({dis[p],p});
	return ;
}

void dij(){
	memset(dis,0x7f,sizeof(dis));
	s=num(1,s);
	dis[s]=0;
	push(s);
	while(q.size()){
		int tp=q.top().se;
		q.pop();
		if(vis[tp]) continue;
		vis[tp]=1;
		for(int i=0;i<a[tp].size();i++){
			int v=a[tp][i].fi,w=a[tp][i].se;
			if(dis[v]>=dis[tp]+w) dis[v]=dis[tp]+w,push(v);
		}
	}
	return ;
}

void build(){//建分层图 , 从第一层开始 
	for(int i=1;i<=m;i++){
		int u,v,w;//从 u 到 v , 边权为 w
		std::cin>>u>>v>>w;
		int ru,rv;
		ru=num(1,u),rv=(1,v);
		edge(ru,rv,w);
		for(int j=2;j<=k+1;j++){//k+1 层的分层图 
			//每次从 j-1 层向 j 层连边
			rv=num(j,v);
			a[ru].push_back(mk(rv,0));
			ru=num(j,u);
			edge(ru,rv,w); 
		} 
	}
	return ;
}

signed main(){
	std::cin>>n>>m>>k>>s>>t;
	build();
	dij();
	int ans=0x3f3f3f3f;
	for(int i=1;i<=k+1;i++) ans=std::min(ans,dis[num(i,t)]);
	std::cout<<ans;
	return 0;
}

2023/11/8 20:23
加载中...