graph.h

 

 
  
  1. #pragma once 
  2. #include"UFset.h" 
  3. #define wuqiong -1 
  4. class bian; 
  5. class graph{ 
  6.     int** juzhen; 
  7.     int num; 
  8.     string *name; 
  9. public
  10.     graph(int); 
  11.     ~graph(); 
  12.     void show()const
  13.     void printEdge(int)const
  14.     void insert(int,int,int); 
  15.     void del(int ,int); 
  16.     void DFS(int)const
  17.     void BMS(int)const
  18.     bian* prim(); 
  19.     bian* Kruskal(); 
  20.     void Dijstra(int); 
  21.     void floyd(); 
  22.  
  23. }; 
  24. graph::graph(int n):num(n){ 
  25.     juzhen=new int*[num]; 
  26.     for(int i=0;i!=num;i++) 
  27.         juzhen[i]=new int[num]; 
  28.     for(int i=0;i<n;i++)  
  29.         for(int j=0;j!=num;j++) 
  30.             juzhen[i][j]=0; 
  31.     name=new string[num]; 
  32.     cout<<"输入各节点名字"<<endl; 
  33.     forint i=0; i<num;i++ ){ 
  34.         cin>>name[i]; 
  35.         for(int j=0;j<i;j++) 
  36.             if(name[i]==name[j] ){ 
  37.                 cout<<"重名了,重输!"
  38.                 i--; 
  39.                 break
  40.             } 
  41.     } 
  42. void graph::show()const
  43.     forint i=0; i!=num;i++ ){ 
  44.         for(int j=0;j!=num;j++) 
  45.             printf("%6d",juzhen[i][j]); 
  46.         cout<<endl; 
  47.     } 
  48.     cout<<endl; 
  49. void graph::printEdge(int k)const
  50.     forint i=0; i!=num;i++ ) 
  51.         if(juzhen[k][i] ) 
  52.             cout<<k<<"->"<<i<<" "<<juzhen[k][i]; 
  53.     cout<<endl; 
  54. void graph::insert(int f,int l,int q){ 
  55.     if(f>=num||l>=num ){ 
  56.         cout<<"输入越界"<<endl; 
  57.         return ; 
  58.     } 
  59.     juzhen[f][l]=q; 
  60.     juzhen[l][f]=q; 
  61. graph::~graph(){ 
  62.     int *l=(int*)juzhen; 
  63.     delete []l; 
  64.     juzhen=0; 
  65.     l=0; 
  66. void graph::del(int f ,int l){ 
  67.     if(f>=num||l>=num ){ 
  68.         cout<<"输入越界"<<endl; 
  69.         return ; 
  70.     } 
  71.     if(juzhen[f][l]==0){ 
  72.         cout<<"没有删除意义"<<endl; 
  73.         return ; 
  74.     } 
  75.  
  76.     juzhen[f][l]=0; 
  77.     juzhen[l][f]=0; 
  78. void graph::DFS(int f )const
  79.     if(f>=num||f<0 ){ 
  80.         cout<<"输入错误!"<<endl; 
  81.         return ; 
  82.     } 
  83.     bool * mark=new bool[num]; 
  84.     for(int i=0;i<num;i++)  
  85.         mark[i]=false
  86.     stack<int> zhan; 
  87.     zhan.push(f); 
  88.     int now=f; 
  89.     cout<<name[f]<<" "
  90.     mark[f]=true
  91.     forint i=0;i<num;i++ ){ 
  92.         if(juzhen[now][i] && mark[i]==false){ 
  93.             cout<<name[i]<<" "
  94.             mark[i]=true
  95.             zhan.push(i); 
  96.             now=i; 
  97.             i=-1; 
  98.             continue
  99.         } 
  100.         if(i==num-1 ){ 
  101.             if(zhan.size()==0){ 
  102.                 for( i=0;i!=num ;i++ ){ 
  103.                     if(mark[i]==false ){ 
  104.                         now=i; 
  105.                         cout<<name[i]<<" "
  106.                         mark[i]=true
  107.                         i=0; 
  108.                         zhan.push(i); 
  109.                         break
  110.                     } 
  111.                 } 
  112.                 if(zhan.size()!=0) 
  113.                     continue
  114.                 break
  115.             } 
  116.             now=zhan.top(); 
  117.             zhan.pop(); 
  118.             i=-1; 
  119.         } 
  120.     } 
  121.     cout<<endl; 
  122. void graph::BMS(int f)const
  123.     queue<int> duilie; 
  124.     int now=f; 
  125.     cout<<name[now]<<" "
  126.     bool *mark=new bool[this->num]; 
  127.     memset(mark,0,num); 
  128.     mark[now]=true
  129.     while(now!=-1){ 
  130.         forint i=0;i< this->num ;i++ ){ 
  131.             if( juzhen[now][i]!=0 && mark[i]==false ){ 
  132.                 duilie.push(i ); 
  133.                 cout<<name[i]<<" "
  134.                 mark[i]=true
  135.             } 
  136.         } 
  137.         if( ! duilie.empty()){ 
  138.             now=duilie.front(); 
  139.             duilie.pop(); 
  140.         } 
  141.         else
  142.             for(int j=0 ; j<num;j++ ){ 
  143.                 if( ! mark[j] ){ 
  144.                     duilie.push(j); 
  145.                     cout<<name[j]<<" "
  146.                     now=j; 
  147.                     mark[j]=true
  148.                     break
  149.                 } 
  150.                 now=-1; 
  151.             } 
  152.              
  153.         } 
  154.  
  155.     } 
  156.     cout<<endl; 
  157. bian* graph::prim( ){ 
  158.     bian* minTree=new bian[num-1]; 
  159.     int treeNum=0; 
  160.     vector<bian> next; 
  161.     int now=0; 
  162.     bool *mark=new bool[num]; 
  163.     memset(mark,true,num ); 
  164.     mark[0]=false
  165.     while(treeNum!=num-1){ 
  166.         forint i=0;i<num ;i++ ) 
  167.             if(juzhen[now][i] && mark[i] ) 
  168.                 next.push_back( bian(now,i,juzhen[now][i]) ); 
  169.         vector<bian>::iterator p=next.begin(); 
  170.         for( vector<bian>::iterator bianli=next.begin()+1 ; bianli!=next.end() ;bianli++ ){ 
  171.             if( p->quanzhi > bianli->quanzhi && mark[bianli->jieshu] ){ 
  172.                 p=bianli; 
  173.                 now=bianli->jieshu; 
  174.             } 
  175.         } 
  176.         minTree[treeNum++]=*p; 
  177.         next.erase(p); 
  178.         mark[now]=0; 
  179.     } 
  180.     return minTree; 
  181. bian* graph::Kruskal(){ 
  182.     UFset *p; 
  183.     p=new UFset(this->num); 
  184.     bian* k=new bian[num*(num+1)/2 ]; 
  185.     int geshu=0; 
  186.     forint i=0; i<num;i++ ){ 
  187.         forint j=0; j+i<num;j++ ){ 
  188.             if(juzhen[ i][j+i ]!=0 ) 
  189.                 k[geshu++]=bian(i,j+i,juzhen[ i][ j+i] ); 
  190.         } 
  191.     } 
  192.     qsort(k,geshu,sizeof(bian),aa); 
  193.     int h=0; 
  194.     bian *re=new bian[num]; 
  195.     forint i=0;i<geshu && h<num ;i++ ){ 
  196.         if( p->isWith(k[i].qishi,k[i].jieshu) ) 
  197.             continue
  198.         re[h++]=k[i]; 
  199.         p->Union(k[i].jieshu,k[i].qishi); 
  200.     } 
  201.     if(h==num ) 
  202.         return re; 
  203.     else 
  204.         return 0; 
  205. //算法关键在于什么时候更新path 
  206. void  graph::Dijstra(int qidian ){ 
  207.     int *path=new int[num]; 
  208.     int now =qidian; 
  209.     int *mark=new int[num]; 
  210.     int *data=new int[num]; 
  211.     memset(mark,0,sizeof(int)*num); 
  212.     for(int i=0;i<this->num;i++) 
  213.         data[i]=wuqiong; 
  214.     data[now]=0; 
  215.     mark[now]=true
  216.     for(int i=0;i<this->num;i++) 
  217.         path[i]=now; 
  218.     forint ii=0; ii<this->num-1;ii++ ){ 
  219.         //更新data 
  220.         forint j=0; j<num;j++ ){ 
  221.             if(this->juzhen[now][j]!=0&&mark[j]==false){ 
  222.                 //什么时候更新path是重点! 
  223.                 if(data[j]==wuqiong ){ 
  224.                     path[j]=now; 
  225.                     data[j]=juzhen[now][j]; 
  226.                 } 
  227.                 if((data[now]+juzhen[now][j])<data[j] ){ 
  228.                     data[j]=data[now]+juzhen[now][j]; 
  229.                     path[j]=now; 
  230.                 } 
  231.             } 
  232.         } 
  233.         int y=0; 
  234.         while(mark[y])y++; 
  235.         forint i=y+1; i<num;i++ ) 
  236.             if(mark[i]==false && data[i]<data[y] && data[i]!=wuqiong ) 
  237.                 y=i; 
  238.         mark[y]=true
  239.         now=y; 
  240.     } 
  241.     //print 
  242.     for(int i=0;i<num;i++){ 
  243.         int j=i; 
  244.         cout<<qidian<<"->"<<i<<" :"<<i<<" "
  245.         while(j!=qidian ){ 
  246.             cout<<path[j]<<" "
  247.             j=path[j]; 
  248.         } 
  249.         cout<<endl; 
  250.     } 
  251. void graph::floyd(){ 
  252.     //初始化 
  253.     int** adj; 
  254.     adj=new int*[this->num]; 
  255.     for(int i=0 ;i<num;i++) 
  256.         adj[i]=new int[num]; 
  257.     for(int i=0;i<num;i++) 
  258.         forint j=0;j<num;j++){ 
  259.             if(juzhen[i][j]) 
  260.                 adj[i][j]=juzhen[i][j]; 
  261.             else 
  262.                 adj[i][j]=wuqiong; 
  263.         } 
  264.     int **path; 
  265.     path=new int*[this->num]; 
  266.     for(int i=0 ;i<num;i++) 
  267.         path[i]=new int[num]; 
  268.     for(int i=0;i<num;i++) 
  269.         forint j=0;j<num;j++) 
  270.             path[i][j]=i; 
  271.     //算法执行 
  272.     for(int i=0;i<num;i++ ){ 
  273.         for(int j=0;j<num;j++){ 
  274.             if(i==j) 
  275.                 continue
  276.             forint y=0; y<num;y++){ 
  277.                 if( adj[j][i]!=wuqiong && adj[i][y]!=wuqiong && (adj[j][i]+adj[i][y]<adj[j][y] ||adj[j][y]==wuqiong)){ 
  278.                     path[j][y]=i; 
  279.                     adj[j][y]=adj[j][i]+adj[i][y]; 
  280.                 } 
  281.             } 
  282.         } 
  283.     } 
  284.     forint i=0; i<num;i++ ){ 
  285.         cout<<"从"<<i<<"开始"<<endl; 
  286.         for(int j=0;j<num;j++){ 
  287.              
  288.             int u=j; 
  289.             cout<<i<<"->"<<j<<" :"<<" "
  290.             while( u!=i ){ 
  291.                 cout<<u<<" "
  292.                 u=path[i][u]; 
  293.             } 
  294.             cout<<i<<endl; 
  295.         } 
  296.     } 
  297.  

bian.h

 

 
  
  1. #pragma once 
  2. #include<iostream> 
  3. #include<stack> 
  4. #include<string> 
  5. #include<queue> 
  6. #include<cstdlib> 
  7. #include<vector> 
  8. #include<cstdlib> 
  9. #include<algorithm> 
  10. #include<map> 
  11. using namespace std; 
  12.  
  13. class bian{ 
  14.     friend class graph; 
  15.     int qishi; 
  16.     int jieshu; 
  17.     int quanzhi; 
  18. public
  19.     void set(int a,int b,int c){ 
  20.         this->jieshu=b; 
  21.         this->qishi=a; 
  22.         this->quanzhi=c; 
  23.     } 
  24.     bian(int a=0,int b=0,int c=0){ 
  25.         this->jieshu=b; 
  26.         this->qishi=a; 
  27.         this->quanzhi=c; 
  28.     } 
  29.     void show(){ 
  30.         cout<<qishi<<"->"<<jieshu<<" : "<<quanzhi<<endl; 
  31.     } 
  32.     bool operator>(bian k){ 
  33.         return quanzhi-k.quanzhi>0; 
  34.     } 
  35.     bool operator<(bian k){ 
  36.         return quanzhi-k.quanzhi<0; 
  37.     } 
  38.     bool operator==(bian k){ 
  39.         return quanzhi==k.quanzhi; 
  40.     } 
  41.     int operator-(bian k ){ 
  42.         return quanzhi-k.quanzhi; 
  43.     } 
  44. }; 
  45. int aa(const void *a,const void *b ){ 
  46.         return *(bian*)a-*(bian*)b; 

MaxHeap.h

 

 
  
  1. #pragma once 
  2. #include<iostream> 
  3. #include<algorithm> 
  4. using namespace std; 
  5.  
  6. template<class T> 
  7. class MaxHeap{ 
  8.     T* heapArray; 
  9.     int CurrentSize; 
  10.     int MaxSize; 
  11. public
  12.     MaxHeap(T*  ,int,int  ); 
  13.     void insert(const T&); 
  14.     void del(); 
  15.     void shift(int ); 
  16.     void show(); 
  17. }; 
  18.  
  19. template<class T> 
  20. MaxHeap<T>::MaxHeap(T* a,int c,int m ){ 
  21.     this->CurrentSize=c; 
  22.     this->MaxSize=m; 
  23.     this->heapArray=new T[c]; 
  24.     forint i=0;i<c ;i++ ) 
  25.         this->heapArray[i]=a[i]; 
  26.     int p=(this->CurrentSize-1)/2; 
  27.     while(p!=-1 ){ 
  28.         this->shift(p--); 
  29.     } 
  30. template<class T> 
  31. void MaxHeap<T>::shift(int num ){ 
  32.     if( num*2+1 >= this->CurrentSize ) 
  33.         return ; 
  34.     int p; 
  35.     if( num*2+2 < this->CurrentSize && this->heapArray[num*2+1] < this->heapArray[num*2+2] ) 
  36.         p=num*2+2; 
  37.     else  
  38.         p=num*2+1; 
  39.     if(this->heapArray[p]>this->heapArray[num] ){ 
  40.         swap(this->heapArray[p],this->heapArray[num]); 
  41.         this->shift(p); 
  42.     } 
  43. template<class T> 
  44. void MaxHeap<T>::show(){ 
  45.     for(int i=0;i<this->CurrentSize;i++) 
  46.         cout<<this->heapArray[i]<<" "
  47.     cout<<endl; 
  48. template<class T> 
  49. void MaxHeap<T>::insert(const T& p){ 
  50.     if(this->CurrentSize==this->MaxSize) 
  51.         return ; 
  52.     this->CurrentSize++; 
  53.     this->heapArray[this->CurrentSize-1]=p; 
  54.     int y=this->CurrentSize-1; 
  55.     while(y){ 
  56.         y=(y-1)/2; 
  57.         this->shift(y); 
  58.     } 
  59. template<class T> 
  60. void MaxHeap<T>::del(){ 
  61.     swap(this->heapArray[0],this->heapArray[this->CurrentSize-1]); 
  62.     this->CurrentSize--; 
  63.     this->shift(0);  

UFset.h

 

 
  
  1. #pragma once 
  2. #include"bian.h" 
  3.  
  4. class UFset{ 
  5.     int num; 
  6.     int *root; 
  7.     int *next; 
  8.     int *length; 
  9. public
  10.     UFset(int); 
  11.     bool isWith(int,int); 
  12.     void Union(int,int); 
  13. }; 
  14.  
  15. UFset::UFset(int n):num(n){ 
  16.     this->root=new int[this->num]; 
  17.     this->next=new int[this->num]; 
  18.     this->length=new int[this->num]; 
  19.     memset(this->length,0,num*4); 
  20.     forint i=0; i<num;i++ ) 
  21.         next[i]=root[i]=i; 
  22.  
  23. bool UFset::isWith(int a,int b){ 
  24.     return root[a]==root[b]; 
  25.  
  26. void UFset::Union(int a,int b){ 
  27.     int l=this->length[a]>this->length[b]?a:b;//目标根->l 
  28.     int r=this->root[l]; 
  29.     int y=next[a]; 
  30.     next[a]=next[b]; 
  31.     next[b]=y; 
  32.     y=root[l]; 
  33.     while(root[ next[l] ]!=y ){ 
  34.         root[ next[l] ]=y; 
  35.         l=next[next[l]]; 
  36.     } 

图定义.cpp(测试代码)

 

 
  
  1. #include"graph.h" 
  2. //此图为无向图 
  3. int main(){ 
  4.     int num,f,l,p; 
  5.     cout<<"输入结点个数"<<endl; 
  6.     cin>>num; 
  7.     graph k(num); 
  8.     cout<<"下面输入节点(按ctrl +Z结束输入)"<<endl<<"f  l  p"<<endl; 
  9. /*  while( cin.good() ){ 
  10.         cin>>f; 
  11.         cin>>l; 
  12.         cin>>p; 
  13.         if(cin.good()) 
  14.             k.insert(f,l,p); 
  15.     } 
  16. */ 
  17.     k.insert(0,1,6); 
  18.     k.insert(0,2,1); 
  19.     k.insert(0,3,5); 
  20.     k.insert(1,2,5); 
  21.     k.insert(2,3,5); 
  22.     k.insert(1,4,3); 
  23.     k.insert(2,4,6); 
  24.     k.insert(3,5,2); 
  25.     k.insert(2,5,4); 
  26.     k.insert(4,5,6);  
  27.     cout<<"show():"<<endl; 
  28.     k.show(); 
  29. /*  cout<<"del(int,int)"<<endl; 
  30.     cin.clear(); 
  31.     cin>>f>>l; 
  32.     k.del(f,l); 
  33.     cout<<"show():"<<endl; 
  34.     k.show(); 
  35.     cout<<"k.DFS(0);"<<endl; 
  36.     k.DFS(0); 
  37.     cout<<"k.BMS(0);"<<endl; 
  38.     k.BMS(0); 
  39.     cout<<"k.prim()"<<endl; 
  40.     bian *op=k.prim(); 
  41.     for(int i=0;i!=num-1;i++) 
  42.         op[i].show(); 
  43.     cout<<endl; 
  44.     op=k.Kruskal(); 
  45.     if(op) 
  46.         for(int i=0;i!=num-1;i++) 
  47.             op[i].show(); 
  48.     else 
  49.         cout<<"no in!!!!"<<endl; 
  50.     */ 
  51.     k.Dijstra(0); 
  52.     k.floyd();