记录编号 68075 评测结果 AAAAAAAAAA
题目名称 通信线路 最终得分 100
用户昵称 GravatarHobo 是否通过 通过
代码语言 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;
}