题意:有n个村庄,编号1-n,以矩阵的形式给出任意两个村庄之间的距离,然后告诉已经有q个村庄已经修好了路,问现在要打算使所有村庄都联通需要修路的最小长度。
思路:构造一棵最小生成树,所以将距离排序,从小到大依次并入,直到集合数为1为止。
感想:这差不多是并查集入门级的题目了,然而我还是不会~
代码:
#include<iostream>
#include<cstring>
using namespace std;
int r[105][105];
int used[105];
int minn[105];
int main()
{
int n;
while(cin>>n){
memset(used,0,sizeof(int)*105);
for(int i=1;i<105;++i)
minn[i]=1000000;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
cin>>r[i][j];
}
int p;
int r1,r2;
cin>>p;
for(int i=0;i<p;++i)
{
cin>>r1>>r2;
r[r1][r2]=0;
r[r2][r1]=0;
}
minn[1]=0;
int sum=0;
for(int i=0;i<n;++i){
int k=-1;
for(int j=1;j<=n;++j)
if(!used[j]&&(k==-1||minn[j]<minn[k]))
k=j;
used[k]=1;
sum+=minn[k];
for(int j=1;j<=n;++j){
if(!used[j]&&r[k][j]<minn[j])
minn[j]=r[k][j];
}
}
cout<<sum<<endl;
}
return 0;
}