題意:有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;
}