社区讨论
求调,连通性判断出错
P3366【模板】最小生成树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjkrz3j
- 此快照首次捕获于
- 2025/11/04 04:11 4 个月前
- 此快照最后确认于
- 2025/11/04 04:11 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
char c=getchar();
int b=1;
while(c<'0'||c>'9'){
if(c=='-'){
b=-1;
}
c=getchar();
}
int res=0;
while(c>='0'&&c<='9'){
res=res*10+(c-'0');
c=getchar();
}
return res*b;
}
const int N=5e3+30,M=2e5+30;
struct EDGE{
int v,nxt;
int w;
}e[2*M];
int head[N];
int ecnt;
int n,m;
void add(int u,int v,int w){
e[++ecnt].nxt=head[u];
e[ecnt].v=v;
e[ecnt].w=w;
head[u]=ecnt;
return;
}
int vis[N],dis[N];
int ans,now;
int cnt=0;
void prim(){
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
vis[i]=0;
}
for(int i=head[1];i;i=e[i].nxt){
int y=e[i].v,z=e[i].w;
dis[y]=min(dis[y],z);
}
now=1;
while(++cnt<n){
int mn=INT_MAX;
vis[now]=1;
for(int i=1;i<=n;i++){
if(vis[i]){
continue;
}
if(mn>dis[i]){
mn=dis[i];
now=i;
}
}
if(dis[now]>=INT_MAX){
cout<<"orz"<<'\n';
exit(0);
}
ans+=mn;
for(int i=head[now];i;i=e[i].nxt){
int y=e[i].v,z=e[i].w;
if(vis[y]){
continue;
}
dis[y]=min(dis[y],z);
}
}
return;
}
signed main(){
n=read(),m=read();
while(m--){
int x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,z);
}
prim();
cout<<ans<<'\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...