社区讨论
求助大佬!!!!!!
学术版参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi7uvx2z
- 此快照首次捕获于
- 2025/11/21 04:00 4 个月前
- 此快照最后确认于
- 2025/11/21 04:00 4 个月前
zkw线段树Dijkstra为啥TLE4个点(P4779)?
CPP#include <bits/stdc++.h>
using namespace std;
#define reg register
static char in[150000],out[10000000],ch[20],*p=in,*pp,*q=out,*t=ch;
#define getch (p==pp&&(pp=(p=in)+fread(in,1,200000,stdin),p==pp)?EOF:*p++)
inline void read(int &x){
x=0;reg char ch;
while((ch=getch)<48);
while(ch>47)x=(x+(x<<2)<<1)+(ch^48),ch=getch;
}
inline void write(int x){
if(!x)*q++=48;
while(x)*t++=x%10+48,x/=10;
while(t!=ch)*q++=*--t;
}
#define Mxn 100001
#define Mxm 400001
#define Inf 0x3f3f3f3f
static int n,m,kk,st,N,head[Mxm],dis[Mxn],mn[400010],bit=1;
struct Node{int v,w,nxt;}eg[Mxm];
inline int fun(const reg int&a,const reg int&b){return dis[a]<dis[b]?a:b;}
inline void modify(reg int x,reg int dist){
for(reg int i=bit+x;dis[mn[i]]>dist;i>>=1)mn[i]=x;dis[x]=dist;
}
inline void del(reg int x){for(mn[x+=bit]=0,x>>=1;x;mn[x]=fun(mn[x<<1],mn[x<<1|1]),x>>=1);}
inline void addedge(reg int u,reg int v,reg int w){
eg[++N]=Node{v,w,head[u]},head[u]=N;
}
__inline__ __attribute__ ((always_inline)) void dij(){
memset(dis,0x3f,kk),modify(st,0);
reg int u;
for(reg int t=n+1,i;--t;)
for(del(u=mn[1]),i=head[u];i;i=eg[i].nxt)
dis[eg[i].v]>dis[u]+eg[i].w&&(modify(eg[i].v,dis[u]+eg[i].w),0);
}
int main(){
pp=p+fread(in,1,150000,stdin);
read(n),read(m),read(st),kk=n+1<<2;
for(reg int u,v,w;m--;addedge(u,v,w))read(u),read(v),read(w);
while((bit<<=1)<n+2);mn[0]=100000;
dij();
for(reg int *s1=dis,*e1=dis+n;s1!=e1;write(*++s1),*q++=' ');
fwrite(out,1,q-out,stdout);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...