蒟蒻分层图+dij 64pts求助 数组开大了
查看原帖
蒟蒻分层图+dij 64pts求助 数组开大了
305121
8atemak1r楼主2021/11/19 11:27
#include<iostream>
#include<stdio.h>
#include<queue>
#define maxm 5000005
#define maxk 15
#define maxn 1000005
#define inf 0x3fffffff
using namespace std;
int n,m,k,st,endd,up;
struct edge{
	int to,next,w;
}e[maxm*maxk*2];
int head[maxn*maxk],cnt;
inline void add(int u,int v,int w){
	e[++cnt]={v,head[u],w};
	head[u]=cnt;
}
int dis[maxn*maxk];
bool vis[maxn*maxk];
struct node{
	int pos,dis;
	bool operator < (const node &x) const{return x.dis<dis;}
};
priority_queue<node> q;
void dij(int s){
	for(int i=1;i<=maxn*maxk;i+=1) dis[i]=inf;
	dis[st]=0;
	q.push({st,0});
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int x=tmp.pos;
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].next){
			int y=e[i].to;
			if(dis[y]>dis[x]+e[i].w){
				dis[y]=dis[x]+e[i].w;
				if(vis[y]==0){
					q.push({y,dis[y]});
				}
			}
		}
	}
}
int main(){
	scanf("%d%d%d%d%d",&n,&m,&k,&st,&endd);
	int u,v,w;
	for(int i=1;i<=m;i+=1){
		scanf("%d%d%d",&u,&v,&w);
		for(int j=0;j<=k;j+=1){
			add(u+j*n,v+(j+1)*n,0);
			add(v+j*n,u+(j+1)*n,0);
		}
		for(int j=0;j<=k;j+=1){
			add(u+j*n,v+j*n,w);
			add(v+j*n,u+j*n,w);
		}
	}
	dij(st);
	int ans=inf;
	for(int i=0;i<=k;i+=1){
		ans=min(ans,dis[n*i+endd]);
	}
	printf("%d",ans);
	return 0;
}
2021/11/19 11:27
加载中...