为什么用并查集做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