社区讨论
求教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 条回复,欢迎继续交流。
正在加载回复...