自己根据《算法导论》伪代码写的c++语言实现prim最小生成树。很烂,但还是发表上来,给自己留个纪念也好

 

  1. #include <iostream> 
  2. #include <fstream> 
  3. #include <queue> 
  4. #include <vector> 
  5. #include <algorithm> 
  6. #include <deque> 
  7. #define MAX 100000 
  8. using namespace std; 
  9.  
  10.  
  11. int key[100]; 
  12. int parent[100]; 
  13. int Graphic[100][101]; 
  14. int Edge[100][100]; 
  15. deque<int> priorityQueue; 
  16. deque<int> primTree; 
  17. int ExtractMin() 
  18.     int min=MAX
  19.     int v,u,r; 
  20.     deque<int>::iterator index=priorityQueue.end(); 
  21.     for(deque<int>::iterator itr=priorityQueue.begin();itr!=priorityQueue.end();itr++) 
  22.     { 
  23.         v=*itr; 
  24.         for(deque<int>::iterator it=primTree.begin();it!=primTree.end();it++) 
  25.         { 
  26.             u=*it; 
  27.             if(Edge[u-1][v-1]!=0&&min>Edge[u-1][v-1]) 
  28.             { 
  29.                 index=itr
  30.                 min=Edge[u-1][v-1]; 
  31.             } 
  32.         } 
  33.     } 
  34.     if(index!=priorityQueue.end()) 
  35.     { 
  36.         r=*index; 
  37.         priorityQueue.erase(index); 
  38.         primTree.push_back(r); 
  39.     } 
  40.     else r=-1; 
  41.     return r; 
  42.  
  43. bool Belong(int val) 
  44.     if(find(priorityQueue.begin(),priorityQueue.end(),val)!=priorityQueue.end()) 
  45.         return true; 
  46.     else return false; 
  47.  
  48. void MstPrim(int root,int n) 
  49.     for(int i=0;i<n;i++) 
  50.     { 
  51.         key[i]=MAX; 
  52.         parent[i]=0; 
  53.     } 
  54.     key[root-1]=0; 
  55.     int u,v; 
  56.     u=root
  57.     primTree.push_back(root); 
  58.     bool flag=true
  59.     priorityQueue.pop_front(); 
  60.     while(true) 
  61.     { 
  62.         if(flag)flag=false
  63.         else     
  64.             u=ExtractMin(); 
  65.         if(u==-1)break; 
  66.         for(int i=1;Graphic[u-1][i]!=0;i++) 
  67.         { 
  68.             v=Graphic[u-1][i]; 
  69.             if(Belong(v)&&Edge[u-1][v-1]!=0&&Edge[u-1][v-1]<key[v-1]) 
  70.             { 
  71.                 parent[v-1]=u; 
  72.                 key[v-1]=Edge[u-1][v-1]; 
  73.             } 
  74.         } 
  75.     } 
  76.  
  77. int main() 
  78.     ifstream cin("acm.txt"); 
  79.     int N,adjNum,tem; 
  80.     cin>>N; 
  81.     for(int i=0;i<N;i++) 
  82.     { 
  83.         cin>>adjNum; 
  84.         priorityQueue.push_back(i+1); 
  85.         Graphic[i][0]=i+1; 
  86.         for(int k=1;k<=adjNum;k++) 
  87.         { 
  88.             cin>>tem; 
  89.             Graphic[i][k]=tem; 
  90.         } 
  91.     } 
  92.     for(int i=0;i<N;i++) 
  93.         for(int k=0;k<N;k++) 
  94.             cin>>Edge[i][k]; 
  95.     MstPrim(1,N); 
  96.     for(int i=0;i<N;i++) 
  97.         cout<<key[i]<<endl
  98.