题目编号:1001
题目大意:有N给村庄,利用二维数组给出相对村庄的距离的权值,求最小生成的最小权值。
解题思路:根据老师上课讲的kuskal模版很容易套用求解。kuskal算法是按边权值大小求最小生成树,比较简单。很固定的算法,创建结构体,然后比较函数来排序利用函数。首先初始化,创建数组来存储距离的权值,按照上课模版套用算法,然后输出结果即可。
解题感想:有了模板也不太好弄,,有参考成分
- #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;
- }