社区讨论

萌新求助

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lp2q4fib
此快照首次捕获于
2023/11/17 22:36
2 年前
此快照最后确认于
2023/11/17 23:00
2 年前
查看原帖
萌新刚学OI第一天,Kruskal算法板子求调QAQ
悬1-2关
CPP
#include<iostream>//Kruskal算法
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<vector>
#include<list>
#include<queue>
#include<deque>
#include<map>
using namespace std;
#define endl '\n'
void Ios()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cout.flags(ios::fixed);
   	cout.precision(6);
    return;
}
int n,m,cnt,f[1005],x[1005],y[1005];
double ans;
vector<int>g[1005],w[1005];
struct edge
{
	int u,v,k;
} e[500005];
bool cmp(edge x,edge y){return x.k<y.k;}
int find(int x)
{
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
void merge(int x,int y)
{
	f[find(x)]=find(y);
	return;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++)
	{
		int u,v,k;
		cin>>u>>v>>k;
		merge(u,v);
	}
	for(int i=1;i<=n;i++)
		for(int j=0;j<g[i].size();j++)
		{
			int nxt=g[i][j];
			if(find(i)!=find(nxt))
			{
				cnt++;
				e[cnt].u=i;
				e[cnt].v=j;
				e[cnt].k=w[i][j];
			}
		}
	sort(e+1,e+cnt+1,cmp);
	for(int i=1;i<=cnt;i++)
		if(find(e[i].u)!=find(e[i].v))
		{
			ans+=e[i].k;
			merge(e[i].u,e[i].v);
		}
	cout<<ans<<endl;
	return 0;
}
祝各位大佬NOIPrp++

回复

1 条回复,欢迎继续交流。

正在加载回复...