社区讨论

求教C++但手写堆dijkstra就对两个,SPFA已过

P3371【模板】单源最短路径(弱化版)参与者 6已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mi7cs58t
此快照首次捕获于
2025/11/20 19:33
4 个月前
此快照最后确认于
2025/11/20 19:33
4 个月前
查看原帖
CPP
#include<cstdio>
using namespace std;
struct node
{
	int d,p;
}a[100007];
int v[500007],p[500007],w[500007],h[100007],t[100007],d[100007],n,m,l,x,y,z,s;
inline int Up(int q)
{
	while (q>1)
		if (a[q].d<a[q>>1].d)
		{
			t[a[q].p]=q>>1;
			t[a[q>>1].p]=q;
			node vq=a[q>>1];
			a[q>>1]=a[q];
			a[q]=vq;
			q=q>>1;
		}
		else
			break;
	return 0;
}
inline int Down(int q)
{
	int vp=q<<1;
	while (vp<=l)
	{
		if (vp<l&&a[vp].d<a[vp+1].d)
			vp++;
		if (a[q].d>a[vp].d)
		{
			t[a[vp].p]=q;
			t[a[q].p]=vp;
			node vq=a[vp];
			a[vp]=a[q];
			a[q]=vq;
			q=vp;
			vp=q<<1;
		}
		else
			break;
	}
	return 0;
}
inline int Insert(node q)
{
	a[++l]=q;
	t[q.p]=l;
	Up(l);
	return 0;
}
inline node Remove(int p)
{
	node vq=a[p];
	t[a[p].p]=0;
	t[a[l].p]=p;
	a[p]=a[l--];
	Up(p);
	Down(p);
	return vq;
}
inline int Modify(int s,int q)
{
	a[s].d=q;
	Up(s);
	Down(s);
	return 0;
}
inline int Read(int &num)
{
	num=0;
	char ch=getchar();
	while (ch<'0'||ch>'9')
		ch=getchar();
	while (ch>='0'&&ch<='9')
	{
		num=(num<<1)+(num<<3)+ch-'0';
		ch=getchar();
	}
	return 0;
}
inline int Write(int &num)
{
	int cl=0;
	char c[47];
	do
	{
		c[++cl]=num%10+'0';
		num/=10;
	}
	while (num>0);
	for (int i=cl;i>=1;--i)
		putchar(c[i]);
	return 0;
}
int main()
{
	Read(n);
	Read(m);
	Read(s);
	for (register int i=1;i<=m;++i)
	{
		Read(x);
		Read(y);
		Read(z);
		v[i]=y;
		w[i]=z;
		p[i]=h[x];
		h[x]=i;
	}
	for (register int i=1;i<=n;++i)
	{
		a[i].d=2147483647;
		a[i].p=i;
		t[i]=i;
	}
	l=n;
	Modify(s,0);
	for (register int i=1;i<=n;++i)
	{
		node vq=Remove(1);
		d[vq.p]=vq.d;
		for (register int j=h[vq.p];j;j=p[j])
		{
			int u=v[j];
			if (a[t[u]].d>(long long)vq.d+w[j])
				Modify(t[u],vq.d+w[j]);
		}
	}
	for (register int i=1;i<=n;++i)
	{
		Write(d[i]);
		putchar(' ');
	}
	return 0;
}

回复

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

正在加载回复...