分层图+dij,27分
查看原帖
分层图+dij,27分
1262406
yhy2024楼主2024/9/27 13:03

rt

#include<bits/stdc++.h>
#define inf 0xffff
#define N 500005
#define int long long
using namespace std; 
int k,n,s,len,dis[N*21],t,sum,m,he[N*41],u,v,w,e1,ans=LONG_LONG_MAX;
struct nn{
	int n,w;
	bool operator < (const nn &B) const{
		return	B.w<w; 
	}
};
struct{
	int to,next,w,from;
}e[N*41];
void add(int x,int y,int z)
{
	sum++;
	e[sum].from=x;
	e[sum].w=z;
	e[sum].to=y;
	e[sum].next=he[x];
	he[x]=sum;
}
priority_queue<nn>q;
main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n*k+n;i++){
		dis[i]=inf;
	} 
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w); 
		for(int j=1;j<=k
		;j++){
			add(u+(j-1)*n,v+j*n,0);
			add(v+(j-1)*n,u+j*n,0); 
			add(u+j*n,v+j*n,w);
			add(v+j*n,u+j*n,w); 
		}
	}
	for(int i=1;i<=k;i++){
        add(n+(i-1)*n,n+i*n,0);
    }
	dis[1]=0;
	q.push({1,0});
	while(!q.empty())
	{
		nn k=q.top();
		int xx=k.n;
		q.pop();
		for(int i=he[xx];i;i=e[i].next)
		{
			int to=e[i].to;
		//	cout<<d[to]<<" "<<e[to].w+k.w<<" "<<xx<<" "<<to<<endl;
			if(dis[to]>e[i].w+dis[xx])
			{		
				dis[to]=e[i].w+dis[xx];
				q.push({to,dis[to]});
			}
		}	
	}
	cout<<dis[n+n*k];
	return 0;
}  
2024/9/27 13:03
加载中...