比赛 防止浮躁的小练习V0.1 评测结果 RRRRRRRRRR
题目名称 P服务点设置 最终得分 0
用户昵称 zjh001 运行时间 0.002 s
代码语言 C++ 内存使用 31.58 MiB
提交时间 2016-10-07 16:41:47
显示代码纯文本
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define MAXN 1510

int n,down,sum;
int a[MAXN][MAXN];
int opt[MAXN];

struct node{
	int u,v,w;
}s[MAXN*MAXN];

inline int gf(int x){
	if (x==opt[x]) return x;
	else return opt[x]=gf(opt[x]);
}

inline int unit(int x,int y){
	opt[gf(x)]=opt[gf(y)];
}

inline int sm(int x,int y){
	if (gf(x)==gf(y)) return 1;
	else return 0;
}

bool cmp(node a,node b)
{
	return a.w<b.w;
}

int main()
{
	int x;
	freopen("mcst.in","r",stdin);
	freopen("mcst.out","w",stdout);
	
	scanf ("%d",&n);
	
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++){
			scanf ("%d",&x);
			if (x!=-1) s[++down].u=i,s[down].v=j,s[down].w=x;
		}
		
	sort(s+1,s+down+1,cmp);
	
	for (int i=1;i<=n;i++) opt[i]=i;
	
	int p=1;
	while (p<=down){
		int u=s[p].u,v=s[p].v,w=s[p].w;
		if (!sm(u,v)){
			sum+=w;
			unit(u,v);
		}
		p++;
	}
	
	printf ("%d\n",sum);
	return 0;
}