求助,只能过样例
查看原帖
求助,只能过样例
549131
Eous楼主2024/3/10 21:47

kruskal

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int u,v,w;
	bool operator<(node x){return w<x.w;}
}e[4000010];
vector<pair<int,int> >v1;
vector<int>v2;
int x[2010],y[2010],c[2010],k[2010];
int idx;
int n,m;
int tmp,f[2010];
int cnt,ans;
void init(int x)
{
	for(int i=1;i<=x;i++)
		f[i]=i;
}
int find(int x)
{
	if(f[x]==x)
		return x;
	return f[x]=find(f[x]);
}
void un(int x,int y)
{
	x=find(x),y=find(y);
	if(x!=y)
		f[x]=y;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	init(n);
	for(int i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++)
	{
		cin>>c[i];
		idx++;
		e[idx].u=n+1;
		e[idx].v=i;
		e[idx].w=c[i];
	}
	for(int i=1;i<=n;i++)
		cin>>k[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<i;j++)
		{
			if(x[i]!=x[j]&&y[i]!=y[j])
			{
				++idx;
				e[idx].u=i;
				e[idx].v=j;
				e[idx].w=(abs(x[i]-x[j])+abs(y[i]-y[j]))*(k[i]+k[j]);
			}
		}
	}
	sort(e+1,e+idx+1);
	for(int i=1;i<=idx;i++)
	{
		if(find(e[i].u)!=find(e[i].v))
		{
			cnt++;
			ans+=e[i].w;
			if(e[i].u!=n+1)
				v1.push_back(make_pair(e[i].u,e[i].v));
			else
				v2.push_back(e[i].v);
			un(e[i].u,e[i].v);
		}
		else
			continue;
	}
	cout<<ans<<endl<<v2.size()<<endl;
	for(auto i:v2)
		cout<<i<<" ";
	cout<<endl;
	if(v1.size())
		for(auto i:v1)
			cout<<i.first<<" "<<i.second<<endl;
	else
		cout<<0<<endl;
	return 0;
}
2024/3/10 21:47
加载中...