Prim+堆优化仍然TLE,哪里优化的不够?

P3366 【模板】最小生成树

为什么用并查集做prim?这边建议链式前向星存边,然后优先队列里对边长进行优化。 这是我的代码你可以参考一下(码风太丑了请见谅) ```cpp #include<bits/stdc++.h> #define maxn 5001 #define maxm 200001 using namespace std; const int inf=2e9; int n,m,head[maxn],tot,dis[maxn],ans,cnt; bool vis[maxn]; struct edge { int next,v,w; }edge[maxm<<1]; inline void add(int x,int y,int z) { edge[++tot].next=head[x]; head[x]=tot; edge[tot].v=y; edge[tot].w=z; } struct node { int dis,pos; bool operator<(const node &x)const { return dis>x.dis; } }; priority_queue<node>q; inline void prim() { dis[1]=0; q.push((node){0,1}); while(!q.empty()&&cnt<n) { int u=q.top().dis,v=q.top().pos; q.pop(); if(vis[v])continue; cnt++; ans+=u; vis[v]=true; for(register int i=head[v];i;i=edge[i].next) { dis[edge[i].v]=edge[i].w; q.push((node){dis[edge[i].v],edge[i].v}); } } } int main() { cin>>n>>m; for(register int i=1;i<=n;i++)dis[i]=inf; for(register int i=1;i<=m;i++) { int xx,yy,zz; cin>>xx>>yy>>zz; add(xx,yy,zz); add(yy,xx,zz); } prim(); if(cnt==n)cout<<ans; else cout<<"orz"; return 0; } ```
by Testlya @ 2021-04-16 21:18:13


严重怀疑楼主是把$Prim$和$Kurskal$搞混了…… 建议使用$Kurskal$
by 天南地北 @ 2021-04-16 21:40:08


数组开太小了
by henutheshy @ 2021-08-12 23:05:14


|