记录编号 188828 评测结果 AAAAAAAAAA
题目名称 最优布线问题 最终得分 100
用户昵称 Gravatar啊吧啦吧啦吧 是否通过 通过
代码语言 C++ 运行时间 1.605 s
提交时间 2015-09-25 14:40:03 内存使用 46.12 MiB
显示代码纯文本
#include <iostream>
#include <climits>
#include <fstream>
//#define self
#include <algorithm>
#include <cstdlib>

using namespace std;
const int MAXN(2001);
struct edge{
	int fr, to, v;
} e[((MAXN * (MAXN - 1) >> 1) + 1) * 2];

ifstream fin("wire.in");
ofstream fout("wire.out");
#define cin fin
#define cout fout
int n, ans = 0, ecnt = 0, fa[MAXN], ne = 0;
inline void kruskal(), uni(edge);
int me(int);
bool cmp(const edge, const edge);

main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j){
			int x;
			cin >> x;
			if (x != 0 && i < j){
				e[++ecnt].fr = i;
				e[ecnt].to = j;
				e[ecnt].v = x;
			}
		}
	
	kruskal();
	
	cout << ans;
	fin.close();
	fout.close();
#ifdef self
	system("fc wire.out wire.ans");
	for (; ; );
#endif
}

inline void kruskal(){
	for (int i = 1; i <= n; ++i)
		fa[i] = i;
	sort(e + 1, e + ecnt + 1, cmp);
	for (int i = 1; i <= ecnt; ++i){
		if (me(e[i].fr) != me(e[i].to))
			uni(e[i]);
		if (ne == n - 1)
			break;
	}
}

bool cmp(const edge a, const edge b)
{
	return a.v < b.v;
}

int me(int x)
{
	if (fa[x] != x)
		fa[x] = me(fa[x]);
	return fa[x];
}

inline void uni(edge y){
	int faa = me(y.fr), fab = me(y.to);
	if (faa != fab)
		fa[me(y.to)] = me(y.fr);
	ans += y.v;
	++ne;
}