Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <fstream>
  6. #define INF 100000
  7. const int N=24;
  8. using namespace std;
  9.  
  10. int minD(vector<int>* mas,int *key){
  11.     vector<int>::iterator min=mas->begin();
  12.     for(vector<int>::iterator i=min+1;i<mas->end();i++) if(key[*i]<=key[*min]) min=i;
  13.     int edge=*min;
  14.     mas->erase(min);
  15.     return edge;
  16. }
  17.  
  18. void Prima(int **in,int **out){
  19.     vector<int> unvisited; 
  20.     int u,v;
  21.     int dist[N];
  22.     int path[N];
  23.     //----------------------clear
  24.     for(int i=0;i<N;i++)
  25.     for(int j=0;j<N;j++) out[i][j]=0;
  26.     //--------------------filling_on_first
  27.     for(int i=0;i<N;i++){
  28.         unvisited.push_back(i);
  29.         dist[i]=INF;
  30.         path[i]=0;
  31.     }
  32.     //----------------------------preparation
  33.     dist[0]=0;
  34.     u=minD(&unvisited,dist);
  35.     //-------------------------algorithm
  36.     while(unvisited.empty()==false){
  37.         for(int i=0;i<N;i++){
  38.             if(i==u || in[u][i]<1) continue;
  39.             if(find(unvisited.begin(),unvisited.end(),i)!=unvisited.end() && in[u][i]<dist[i]){
  40.                 dist[i]=in[u][i];
  41.                 path[i]=u;
  42.                 }
  43.         }
  44.             u=minD(&unvisited,dist);
  45.             //cout<<unvisited.size()<<endl;
  46.     }
  47.     for(int i=0;i<N;i++) {
  48.         if(dist[i]==INF) dist[i]=0;
  49.         out[path[i]][i]=dist[i];
  50.         out[i][path[i]]=dist[i];
  51.     }
  52.    
  53. }
  54.  
  55. void printGraph(int **mas){
  56.     cout<<"   ";
  57.     for(int i=0;i<N;i++) {
  58.         if(i<10) cout<<' ';
  59.         cout<<' '<<i;
  60.     }
  61.     cout<<endl<<"  ";
  62.     for(int i=0;i<N;i++) cout<<"___";
  63.     cout<<endl;
  64.     for(int i=0;i<N;i++){
  65.         if(i<10) cout<<' ';
  66.         cout<<i<<"| "<<mas[i][0];
  67.         for(int j=1;j<N;j++) {
  68.             if(mas[i][j]>9) cout<<' '; else cout<<"  ";
  69.             cout<<mas[i][j];
  70.         }
  71.         cout<<endl;
  72.     }
  73. }
  74.  
  75. void clearM(int **mas){
  76.     for(int i=0;i<N;i++){
  77.         delete [] mas[i];
  78.     }
  79.     delete [] mas;
  80. }
  81.  
  82. int main() {
  83.     ifstream in("test.txt");
  84.     int** graph=new int*[N];
  85.     for(int i=0;i<N;i++) graph[i]=new int[N];
  86.     int** tree=new int*[N];
  87.     for(int i=0;i<N;i++) tree[i]=new int[N];
  88.     for(int i=0;i<N;i++)
  89.     for(int j=0;j<N;j++) in>>graph[i][j];
  90.     for(int i=0;i<N;i++)
  91.     for(int j=0;j<N;j++) if(i<j) graph[j][i]=graph[i][j];
  92.     in.close();
  93.     printGraph(graph);
  94.     Prima(graph,tree);
  95.     cout<<"Tree:\n";
  96.     printGraph(tree);
  97.     clearM(graph);
  98.     clearM(tree);
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement