社区讨论

90分 RE 求助

P5060旅行参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7dwhfo
此快照首次捕获于
2025/11/20 20:05
4 个月前
此快照最后确认于
2025/11/20 20:05
4 个月前
查看原帖
RT 不知道最后一个点为什么会RE
各位大佬帮忙看看谢谢
CPP
#include "bits/stdc++.h"
#define M 2500010
using namespace std;

int N,n,m,k,start,end,u,v,w,x,size,fee,last[M],f[M],pos[M],heap[M];
int K,to[M],len[M],first[M],next[M];

inline void read(int &x)
{
	int s=1;
	char ch=0;
	x=0;
	while(ch^'-'&&!isdigit(ch))
		ch=getchar();
	if(ch=='-')
	{
		s=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	x*=s;
}

void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}

inline void add(int x,int y,int z)
{
	K++;
	to[K]=y;
	len[K]=z;
	next[K]=first[x];
	first[x]=K;
}

inline void S(int x,int y)
{
	swap(pos[heap[x]],pos[heap[y]]);
	swap(heap[x],heap[y]);
}

inline void update1(int i)
{
	i=pos[i];
	while(f[heap[i]]<f[heap[i>>1]])
		S(i,i>>1),i>>=1;
}

inline void update2(int i)
{
	S(i,size);
	heap[size--]=n+1;;
	while((i<<1)<=size)
	{
		if(f[heap[i]]<=f[heap[i<<1]]&&f[heap[i]]<=f[heap[(i<<1)+1]])
			break;
		if(f[heap[i<<1]]<f[heap[(i<<1)+1]])
			S(i,i<<1),i<<=1;
		else
			S(i,(i<<1)+1),i=(i<<1)+1;
	}
}

void print(int x)
{
	if(!last[x])
	{
		write(x);
		return;
	}
	print(last[x]);
	putchar('-'),putchar('>');
	write((x-1)%N+1);
}

int main()
{
	read(N),read(m),read(k),read(start),read(end);
	n=N*k;
	for(int i=1;i<=m;i++)
	{
		read(u),read(v),read(w);
		add(u,v,w);
	}
	for(int i=1;i<=n+1;i++)
		f[i]=INT_MAX;
	f[start]=0;
	size=n;
	for(int i=1;i<=n;i++)
		heap[i]=pos[i]=i;
	update1(start);
	for(int i=1;i<=n;i++)
	{
		x=heap[1];
		if(x==end)
			break;
		if(f[x]==INT_MAX)
		{
			printf("jjc fails in travelling");
			return 0;
		}
		update2(1);
		for(int p=first[(x-1)%N+1];p;p=next[p])
		{
			fee=f[x]+len[p];
			w=to[p]+N*(fee%k);
			if(f[w]>fee)
			{
				f[w]=fee;
				last[w]=x;
				update1(w);
			}
		}
	}
	write(f[end]),putchar('\n');
	print(end);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...