如题
查看原帖
如题
1085779
duanhongwen楼主2024/10/11 00:46
#include<bits/stdc++.h>

using namespace std;
const int N=1e4,K=55,M=2e3+7;
struct side
{
	int nxt,to,value;
}edge[M];
struct smallheap
{
	int point,num,t;
}heap[N];
int n,m,k,head[N],distance1[N][K],cnt;
bool visit[N][K];
void addedge(int a,int b,int w)
{
	edge[++cnt].nxt=head[a];
	head[a]=cnt;
	edge[cnt].to=b;
	edge[cnt].value=w;
}
void heapinsert(int p,int numk,int pay,int heapsize)
{
	heap[heapsize].point=p;
	heap[heapsize].num=numk;
	heap[heapsize].t=pay;
	while(heap[heapsize].t<heap[heapsize>>1].t&&heapsize!=1)
	{
		swap(heap[heapsize],heap[heapsize>>1]);
		heapsize/=2;
	}
}
smallheap eject(int i,int heapsize)
{
	smallheap ans=heap[i];
	swap(heap[i],heap[heapsize--]);
	int l=i*2;
	while(l<=heapsize)
	{
		int best=l+1<=heapsize&&heap[l+1].t<heap[l].t?l+1:l;
		best=heap[best].t<heap[i].t?best:i;
		if(best==i)
		{
			break;
	    }
	    swap(heap[best],heap[i]);
	    i=best;
	    l=i*2;
	}
	return ans;
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		addedge(a,b,c);
		addedge(b,a,c);
	}
	int heapsize=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=k;j++)
		{
			distance1[i][j]=INT_MAX;
		}
	}
	distance1[1][0]=0;
	heapinsert(1,0,0,++heapsize);
	while(heapsize!=0)
	{
		smallheap x=eject(1,heapsize--);
	    if(visit[x.point][x.num])
	    {
			continue;
		}
		visit[x.point][x.num]=true;
		if(x.point==n)
		{
			cout<<x.t;
			return 0;
		}
		for(int i=head[x.point];i!=0;i=edge[i].nxt)
		{
			int v=edge[i].to,w=edge[i].value;
			if(x.num<k&&distance1[v][x.num+1]>distance1[x.point][x.num]+w/2)
			{
				distance1[v][x.num+1]=distance1[x.point][x.num]+w/2;
				heapinsert(v,x.num+1,distance1[v][x.num+1],++heapsize);
			}
			if(distance1[v][x.num]>distance1[x.point][x.num]+w)
			{
				distance1[v][x.num]=distance1[x.point][x.num]+w;
				heapinsert(v,x.num,distance1[v][x.num],++heapsize);
			}
		}
	}
}
2024/10/11 00:46
加载中...