比赛 |
防止浮躁的小练习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;
}