头文件:


#include <functional>
#include 
<vector>

并查集:

  UFset
{
public :
    vector
<int> parent;
    UFset(
int n);
    
int  Find( int );
    
void  Union( int ,  int );
} ;

UFset::UFset(
int n)
{
    parent.resize(n);
}

int  UFset::Find( int  x)
{
    
if  (parent[x]  <=   0 )
        
return  x;
    
else
    {
        parent[x]  
=  Find(parent[x]);
        
return  parent[x];
    } 
//  压缩路径
}

void  UFset::Union( int  x,  int  y)
{
    
int  pX  =  Find(x);
    
int  pY  =  Find(y);
    
int  tmp;
    
if  (pX  !=  pY)
    {
        tmp  
=  parent[pX]  +  parent[pY];  //  加权合并
        if  (parent[pX]  >  parent[pY])
        {
            parent[pX]  
=  pY;
            parent[pY]  
=  tmp;
        }
        
else
        {
            parent[pY]  
=  pX;
            parent[pX]  
=  tmp;
        }
    }


#include 
<functional>
#include 
<vector>

kruskal算法:

 Edge
{
    double dis;
    
int v,w;
    
bool operator<(const Edge &e1)const
    {
        
return dis<e1.dis;
    }
    
bool operator>(const Edge &e1)const
    {
        
return dis>e1.dis;
    }
    Edge(
int vv,int ww,double diss)
    {
        v
=vv;
        w
=ww;
        dis
=diss;
    }
};
priority_queue
<Edge,vector<Edge>,greater<Edge>> e;//边集
priority_queue<Edge,vector<Edge>,less<Edge>> te;//生成树的边集
int p;//顶点数


    UFset u(p
+1);
    
int k=0;
    
while(e.size()&&k<p-1)
    {
        Edge x
=e.top();
        e.pop();
        
int a=u.Find(x.w);
        
int b=u.Find(x.v);
        
if (a!=b)
        {
            te.push(x);
            u.Union(a,b);
        }
    }

 

相关文章: