社区讨论

求助大佬!!!!!!

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...