社区讨论

求调,连通性判断出错

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 条回复,欢迎继续交流。

正在加载回复...