只ac 2,13.
  • 板块P1194 买礼物
  • 楼主RY111
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/10 15:19
  • 上次更新2024/8/10 16:15:10
查看原帖
只ac 2,13.
1233392
RY111楼主2024/8/10 15:19

没设虚拟节点,直接把优惠和a的min当成边,然后再加上第一个点的a1

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010*1010;
int pre[1010];
struct node{
	int a,b,w;
	bool operator <(const node &a)const
	{
		return w<a.w;
	}
}g[maxn];
int find(int a)
{
	if(pre[a]==a)
	return pre[a];
	else
	return pre[a]=find(pre[a]);
}
int main()
{
	int a1,b1;
	cin>>a1>>b1;
	int cnt=1;
	for(int i=1;i<=a1;i++)pre[i]=i;
	for(int i=1;i<=b1;i++)
	{
		for(int j=1;j<=b1;j++)
		{int w;
			if(j>i) break;
			cin>>w;
			g[cnt++].a=i;
			g[cnt].b=j;
			if(w==0)
			
			g[cnt].w=a1;
			else
			g[cnt].w=w;
			
		}
	}
	int ans=a1;//第一个点的价格 
	sort(g+1,g+1+cnt);
	for(int i=1;i<=cnt;i++)
	{
		int x=g[i].a;
		int y=g[i].b;
		if(find(x)!=find(y))
		{
				pre[find(x)]=find(y);
				ans+=g[i].w;
		}
	
		
	}
	cout<<ans<<endl;
	
}
2024/8/10 15:19
加载中...