您的位置:首页 > 其它

SDAU练习1001

2016-07-07 16:26 253 查看
题目编号:1001

题目大意:有N给村庄,利用二维数组给出相对村庄的距离的权值,求最小生成的最小权值。

解题思路:根据老师上课讲的kuskal模版很容易套用求解。kuskal算法是按边权值大小求最小生成树,比较简单。很固定的算法,创建结构体,然后比较函数来排序利用函数。首先初始化,创建数组来存储距离的权值,按照上课模版套用算法,然后输出结果即可。

解题感想:有了模板也不太好弄,,有参考成分

[html] view
plain copy

 





#include<iostream>  

#include<algorithm>  

using namespace std;  

struct node{  

    int x,y,n;  

}arr[10001];  

  

int brr[10001],crr[101][101];  

 bool cmp(const node&a, const node&b)  

{  

    return (a.n<b.n);  

}  

  

int YJY(int k)  

{  

    if (brr[k]==k)  

     return k;  

    else {  

        int tmp=YJY(brr[k]);  

        brr[k]=tmp;  

        return tmp;  

    }  

}  

int main(){  

    int i,j,k,n,size,x,y,sum=0;  

    cin>>n;  

    for (i=0;i<n*n;i++)  

       brr[i]=i;  

  

    for (i=1;i<=n;i++)  

        for (j==1;j<=n;j++)  

            cin>>crr[i][j];  

    cin>>k;  

    for (i=0;i<k;i++)  

    {  

        cin>>x>>y;  

        crr[x][y]=0;  

        crr[y][x]=0;  

    }  

  

    for (i=1,k=0;i<n;i++)  

        for (j=1;j<n;j++,k++)  

        {  

            arr[k].x=i;  

            arr[k].y=j;  

            arr[k].n=crr[i][j];  

        }  

    sort(arr,arr+n*n,cmp);  

    for (k=0,i=0;k<n-1;i++)  

    {  

        x=YJY(arr[i].x);  

        y=YJY(arr[i].y);  

        if (x!=y)  

        {  

                 brr[x]=y;  

                 sum+=arr[i].n;  

                 k++;  

                 }  

    }  

    cout<<sum<<endl;  

    return 0;  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: