求助分层图,WA#3
查看原帖
求助分层图,WA#3
335094
Lucifero楼主2021/7/14 14:07
#include <bits/stdc++.h>
#define int long long
#define P pair<int,int>
#define xx first
#define yy second
#define inf 0x3f3f3f3f
#define N 10000
#define M 50000
#define K 10
#define gl(x,y) (n*(x)+(y))
using namespace std;
class Edge
{
public:
	int u,v,w,next;
}e[2*M*(4*K+2)+1];
priority_queue<P,vector<P>,greater<P> > r;
bool road[N*K+1];
int elast[N*K+1],dis[N*K+1],n,ans(inf),link;
void add(int u,int v,int w)
{
	e[++link]=(Edge){u,v,w,elast[u]};
	elast[u]=link;
}
void dijkstra(int u)
{
	int v,i;
	memset(dis,inf,sizeof(dis));
	dis[u]=0;
	r.push(make_pair(dis[u],u));
	while(!r.empty())
	{
		u=r.top().yy,r.pop();
		if (road[u]) continue;
		road[u]=true;
		for(i=elast[u];i!=0;i=e[i].next)
		{
			v=e[i].v;
			if (dis[v]>dis[u]+e[i].w)
			{
				dis[v]=dis[u]+e[i].w;
				r.push(make_pair(dis[v],v));
			}
		}
	}
}
signed main()
{
	//[JLOI2011]飞行路线(【模板】分层图操作)
	int m,k,s,t,a,b,c,i;
	scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&s,&t);
	s++,t++;
	while(m--)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		a++,b++;
		add(a,b,c),add(b,a,c);
		for(i=1;i<=k;i++)
		{
			add(gl(i-1,a),gl(i,b),0);
			add(gl(i-1,b),gl(i,a),0);
			add(gl(i,a),gl(i,b),c);
			add(gl(i,b),gl(i,a),c);
		}
	}
//	for(i=1;i<=k;i++) add(gl(i-1,t),gl(i,t),0);
	dijkstra(s);
	for(i=0;i<=k;i++) ans=min(ans,dis[gl(i,t)]);
	printf("%lld",ans);
}
2021/7/14 14:07
加载中...