萌新求助
  • 板块灌水区
  • 楼主threebodier
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/17 22:35
  • 上次更新2023/11/17 23:00:44
查看原帖
萌新求助
941335
threebodier楼主2023/11/17 22:35

萌新刚学OI第一天,Kruskal算法板子求调QAQ

悬1-2关

#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++

2023/11/17 22:35
加载中...