题目编号:1001
题目大意:有N给村庄,利用二维数组给出相对村庄的距离的权值,求最小生成的最小权值。
解题思路:算是个水题吧,根据老师上课讲的kuskal模版很容易套用求解。kuskal算法是按边权值大小求最小生成树,比较简单。很固定的算法,创建结构体,然后比较函数来排序利用函数。首先初始化,创建数组来存储距离的权值,按照上课模版套用算法,然后输出结果即可。
解题感想:坚持到一半以上就OK了,最近复习的都疯狂了我。
#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;
}