/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回最小的花费代价使得这n户人家连接起来
 * @param n int整型 n户人家的村庄
 * @param m int整型 m条路
 * @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
 * @param costRowLen int cost数组行数
 * @param costColLen int* cost数组列数
 * @return int整型
 */
#define MAX 10000000
int find(int*parent,int i)
{
    while(parent[i]!=MAX)
    {
        i=parent[i];
    }
    return i;
} 
void merge(int**cost,int**cost1,int i,int m,int n)
{
    int k=i;
    int j,l;
    for(j=m+1;i<=m&&j<=n;k++)
    {
        if(cost[i][2]<cost[j][2])
        {
            cost1[k]=cost[i];
            i++;
        }
        else
        {
            cost1[k]=cost[j];
            j++;        
        }
    }
    if(i<=m)
    {
        for(l=0;l<=m-i;l++)
        {
           cost1[k+l]=cost[i+l];
        }
    }
    if(j<=n) 
    {
        for(l=0;l<=n-j;l++)
        {
          cost1[k+l]=cost[j+l];
        }
    }

}
void mergesort(int**cost,int**cost1,int s,int t,int k)
{
    int i=s;
    int j;
    while(i<=t-2*k+1)
    {
        merge(cost,cost1,i,k+i-1,i+2*k-1);
        i=i+2*k;
    }
    if(i<t-k+1)
    {
        merge(cost,cost1,i,i+k-1,t);
    }
    else 
    {
        for(j=i;j<=t;j++)
        {
          cost1[j]=cost[j];
        }
    }

}
int miniSpanningTree(int n, int m, int** cost, int costRowLen, int* costColLen ) {
    int i,j,a,b;
    int parent[n+1];
    int min;
    int *p;
    int lowcost=0;
    int arr[3]={1,1,1};
    int**cost1=(int**)malloc(m*sizeof(int*));
    for(i=0;i<m;i++)
    {
        cost1[i]=arr;
    }
    // printf("%d",2);
    // printf("%d",20);
    int k=1;
    while(k<m)
    {
        mergesort(cost,cost1,0,m-1,k);
        k=k*2;
        mergesort(cost1,cost,0,m-1,k);
        k=k*2;
    }
    // for(i=0;i<m;i++)
    // {
    //     for(j=0;j<m;j++)
    //     {
    //         printf("%d",cost[i][j]);
    //     }
    // }
    for(i=0;i<n+1;i++)
    {
        parent[i]=MAX;
    }
    for(i=0;i<m;i++)
    {
        a=find(parent,cost[i][0]);
        b=find(parent,cost[i][1]);
        if(a!=b)
        {
            parent[a]=b;
            lowcost+=cost[i][2];
        }
        
    }
    return lowcost;


    // write code here
}