prim
prim算法是计算最小生成树的一种算法。
运算方法是任取一个点,以这个点为集合开始,然后对所有点与这个点的距离进行更新,找出离这个集合最近的点,然后把这个点放进这个集合(所以每一次运算的时候都要判断一下这个点是否在这个集合里,所有要用到一个vister数组),然后再以这个集合继续寻找离这个集合最近的点,直到没有点存在。
输入:N个点和邻接矩阵
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 //============================================================================== 6 void init(); 7 void prim(); 8 //============================================================================== 9 int map[105][105],vister[105],dis[105],N,ans=0; 10 //============================================================================== 11 void init() 12 { 13 cin>>N; 14 for(int i=1;i<=N;i++){ 15 for(int j=1;j<=N;j++){ 16 cin>>map[i][j]; 17 } 18 } 19 memset(dis,0x3f3f3f3f,sizeof(dis)); //对距离初始化为无穷 20 } 21 //============================================================================== 22 void prim() 23 { 24 //对这个点的距离初始化为0. 25 dis[1]=0; 26 for(int i=1;i<=N;i++){ 27 int MIN=0x3f3f3f3f; //寻找最小值 28 int x; //最小值得坐标 29 for( int j=1;j<=N;j++ ){ 30 if( vister[j]==0 && MIN>dis[j] ){ 31 MIN=dis[j]; 32 x=j; 33 } 34 } 35 //====================== 36 ans+=dis[x]; //将找到的最小边加入答案里 37 vister[x]=1; //标记这个点被访问 38 //====================== 39 for(int j=1;j<=N;j++){ //循环更新距离数组 40 if( dis[j]>map[x][j] && map[x][j]>0 && vister[j]==0 ){ 41 dis[j]=map[x][j]; 42 } 43 } 44 } 45 } 46 //============================================================================== 47 int main() 48 { 49 init(); 50 prim(); 51 cout<<ans; 52 //system("pause"); 53 return 0; 54 }
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号