记录编号 |
68075 |
评测结果 |
AAAAAAAAAA |
题目名称 |
通信线路 |
最终得分 |
100 |
用户昵称 |
Hobo |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.704 s |
提交时间 |
2013-08-16 16:13:19 |
内存使用 |
46.15 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ULL unsigned long long
#define MAXP 16000
#define MAXN 3000000
using namespace std;
int P[MAXP],Q[MAXN],I,J,R,B,ANS=0,M=0,T,U[MAXN],V[MAXN],W[MAXN],N,N_T;
int find(int x) {R=x;while (R!=P[R]) R=P[R];I=x;while (I!=R) {J=P[I];P[I]=R;I=J;} return R;}
int merge(int x,int y) {if (x<y) P[y]=x;else P[x]=y;}
bool cmp(const int i,const int j) {return W[i]<W[j];}
int main()
{
freopen("mcst.in","r",stdin);
freopen("mcst.out","w",stdout);
scanf("%d",&N);
N_T=N;
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
{
scanf("%d",&T);
if (T!=-1)
{
U[M]=i;
V[M]=j;
W[M]=T;
Q[M]=M;
M++;
}
}
for (int i=0;i<N_T;i++) P[i]=i;
sort(Q,Q+M,cmp);
for (int i=0;i<M;i++)
{
int E=Q[i];
int X=find(U[E]);
int Y=find(V[E]);
if (X!=Y) {ANS+=W[E];merge(X,Y);B++;}
if (B==N-1) {break;}
}
B==N-1?printf("%d\n",ANS):printf("-1\n");
return 0;
}