菜鸡求助这个prim
查看原帖
菜鸡求助这个prim
239895
Yusani_huh楼主2020/8/3 22:30

对比了 nn 个正解就是找不出问题在哪 /kk

#include<bits/stdc++.h>
using namespace std;
int n,m,g[5003][5003],d[5003];
bool vis[5003];
int prim(){
	d[1]=0;
	int ans=0;
	for(int i=1;i<=n;++i){
		int mi=0x3f3f3f3f,u=-1;
		for(int j=1;j<=n;++j)
			if(!vis[j]&&d[j]<mi)
				u=j,mi=d[j];   //更新选择连接的边
		if(u==-1) return -1;
		vis[u]=true;
		ans+=d[u];
		for(int v=1;v<=n;++v)
			if(!vis[v]&&g[u][v]<d[v])
				d[v]=g[u][v];   //更新到各点的最小权值
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	memset(d,0x3f,sizeof(d));
	memset(g,0x3f,sizeof(g));
	int u=0,v=0,w=0;
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&u,&v,&w);
		g[u][v]=g[v][u]=w;
	}
	int ans=prim();
	if(ans==-1) printf("orz\n");
	else printf("%d\n",ans);
	return 0;
}
2020/8/3 22:30
加载中...