http://poj.org/problem?id=1258
这道题是最简单的一个啦,,,,
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 const int N=110; 7 #define M 0x3f3f3f3f///设置无穷大的数M,当两点之间无法联通时设两者之间距离为M 8 int ma[N][N],low[N],vis[N];///ma记录道路的长度,low记录最短的路径,vis判断是否经过这点 9 int n; 10 int prim(){ 11 int i,j,pos,mi,result=0; 12 memset(vis,0,sizeof(vis)); 13 vis[1]=1;///从1开始遍历 14 pos=1;///记录当前结点 15 16 17 for(i=1;i<=n;i++) 18 if(i!=pos)low[i]=ma[pos][i];///,初始时pos等于1,查找pos周围可以通过的结点中最短的距离并存储在low中 19 20 21 for(i=1;i<n;i++){///遍历n-1次 22 mi=M; 23 for(j=1;j<=n;j++){ 24 if(vis[j]==0&&mi>low[j]){ 25 mi=low[j]; 26 pos=j; 27 28 } 29 } 30 result+=mi; 31 vis[pos]=1; 32 for(j=1;j<=n;j++){///查找pos周围的最短的距离 33 if(vis[j]==0&&low[j]>ma[pos][j]) 34 low[j]=ma[pos][j]; 35 } 36 } 37 return result; 38 } 39 int main() 40 { 41 int i,v,j,ans; 42 while(~scanf("%d",&n)){ 43 memset(ma,M,sizeof(ma)); 44 for(i=1;i<=n;i++){ 45 for(j=1;j<=n;j++){ 46 scanf("%d",&v); 47 ma[i][j]=ma[j][i]=v; 48 49 } 50 } 51 ans=prim(); 52 cout<<ans<<endl; 53 } 54 return 0; 55 }
时间: 2024-12-06 10:11:56