Charmer--viv【并查集】【最小生成树】

>Description
Loi54 的viv有另一个身份----魔♂术♂师,今天他要变一个魔♂术,但是,viv找不到他的魔法球了。一定是调皮的dc把球藏了起来。viv找到了dc,没想到腹黑的dc不光不交出viv魔法球,还向viv索要赎金。

作为一个安静的美男子,viv不想用暴♂力解决此事,再者dc还是viv的同学,所以viv忍气吞声,准备花RMB赎回自己的魔法球。

dc的服务态度“良♂好”,给出了详细的“询问”价格表。

价格表的形式如下:

(dc把viv的魔法球放在一个区间内([1,n])的一个位置上)

Cij: 代表询问[I,j]这个区间球的数量的奇偶性要付多少钱。

Viv没有多少钱,所以viv决定采取最优策略,花最少的钱来找出自己的球。

但是Viv不光是穷X,还是个蒟蒻,怎么可能找出最优策略,机智的viv想到了机智的你们….

Viv:“求帮忙….QwQ”


>Input
第一行一个整数n。
第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的花费。其中c_ij(对区间[i,j]进行询问的费用,1<=i<=j<=n,1<=c_ij<=10^9)为第i+1行第j+1-i个数。

>Output
输出一个整数,表示最少花费。

30%: n <= 50
60%: n <= 500
100% n <= 1600 (由于无法传输大文件,所以只能这么小了,我是不是太良心了…)


>解题思路
做之前没有做的题,发现这道题跟Kuglarz一毛一样……(又轻松A了一道紫题^^)


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
#define N 1605
using namespace std;

struct line
{
	int c, x, y;
} a[1300005];
int n, c[N], t, w, ans;

bool bmp (line aa, line bb) {return aa.c < bb.c;}
int find (int now)
{
	if (c[now] == now) return now;
	return c[now] = find (c[now]);
}

signed main()
{
	scanf ("%lld", &n);
	for (int i = 1; i <= n; i++)
	  for (int j = i; j <= n; j++)
	  {
	  	scanf ("%lld", &w);
	  	a[++t] = (line) {w, i - 1, j};
	  }
	sort (a + 1, a + 1 + t, bmp);
	for (int i = 0; i <= n; i++) c[i] = i;
	for (int i = 1; i <= t; i++)
	{
		int u = find (a[i].x), v = find (a[i].y);
		if (u != v)
		{
			ans += a[i].c;
			c[u] = v;
		}
	}
	printf ("%lld", ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值