ACM第四次練習—1001

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章