82分,玄关,不玻璃心,有问题可以骂
查看原帖
82分,玄关,不玻璃心,有问题可以骂
464730
Y_Rui楼主2024/10/13 20:36

手写堆,迪杰斯特拉,分层图,WA#4#10 感谢帮助

#include<bits/stdc++.h>
using namespace std;
int N,M,K,S,T;
int head[200020],nex[2500020],to[2500020],jg[2500020],cnt;
int dis[200020],dui[200020],cd,use[200020];
void push(int x)
{
	cd++;
	dui[cd]=x;
	int i=cd;
	while(i>1&&dis[dui[i/2]]>dis[dui[i]])
	{
		swap(dui[i/2],dui[i]);
		i=i/2;
	}
}
void pop()
{
	dui[1]=dui[cd];
	cd--;
	int i=1;
	while(i*2<=cd)
	{
		int son=i*2;
		if(son<cd&&dis[dui[son+1]]<dis[dui[son]])
		{
			son++;
		}
		if(dis[dui[son]]<dis[dui[i]])
		{
			swap(dui[son],dui[i]);
			i=son;
		}
		else break;
	}
}
void add(int u,int v,int a)
{
	cnt++;
	nex[cnt]=head[u];
	to[cnt]=v;
	jg[cnt]=a;
	head[u]=cnt;
}
int main()
{
	scanf("%d%d%d%d%d",&N,&M,&K,&S,&T);
	S++;T++;
	int u,v,a;
	for(int i=1;i<=M;i++)
	{
		scanf("%d%d%d",&u,&v,&a);
		u++,v++;
		add(u,v,a);add(v,u,a);
		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,a);add(v+j*N,u+j*N,a);
		}
	}
	for(int i=1;i<=N+K*N;i++) dis[i]=0x7f7f7f7f;
	dis[S]=0;
	push(S);
	while(cd)
	{
		int u=dui[1];
		pop();
		if(use[u]) continue;
		else use[u]=1;
		int tt=head[u],vv=to[tt];
		while(vv)
		{
			if(dis[vv]>dis[u]+jg[tt])
			{
				dis[vv]=dis[u]+jg[tt];
				push(vv);
			}
			//printf("%d!\n",vv);
			tt=nex[tt],vv=to[tt];
		}
	}
	int minn=0x7f7f7f7f;
	for(int i=0;i<=K;i++) minn=min(minn,dis[T+i*N]);
	printf("%d",minn);
}
2024/10/13 20:36
加载中...