Kruskal&&prim

来源:互联网 发布:ubuntu 搜狗拼音 乱码 编辑:程序博客网 时间:2024/04/30 23:01

Prim算法和kruskal算法用在不同时候时间不同,前者适合稠密图(点多的图),后者适合稀疏图(边多的图)

如果题目数据比较大无法存邻接矩阵的形式,只能用后者,不然爆栈.

Prime算法

注意:map[N][N]要初始化为Inf

#include<iostream>

#include<algorithm>

#include<stdlib.h>

#include<string.h>

#include<string>

#include<vector>

#include<queue>

#include<list>

using namespacestd;

typedef longlonglld;

typedef unsignedintud;

#define InfINT_MAX//int最大

#define Min(x,y)(x)<(y)?(x):(y)

#define Max(x,y)(x)>(y)?(x):(y)

#define PQpriority_queue

#define Qqueue

#define N102

int map[N][N];

int mark[N];

int low[N];

int n,m;

int prim(ints)

{

      intres=0;

      for(inti=1;i<=n;i++)

      {

           low[i]=map[s][i];

           mark[i]=0;

      }

      low[s]=0;mark[s]=1;

     

      intt=n-1;

      while(t--)

      {

           intmin=Inf;

           intk;

           for(inti=1;i<=n;i++)

                 if(!mark[i]&&low[i]<min)

                 {

                      min=low[i];

                      k=i;

                 }

 

           res+=low[k];

           mark[k]=1;

           for(inti=1;i<=n;i++)

           {

                 if(!mark[i]&&map[k][i]<low[i])

                      low[i]=map[k][i];

           }

      }

      returnres;

}

 

Kruskal算法(这个算法比较活,同样可以用在生成树的问题上)

 

#include<iostream>

#include<algorithm>

#include<stdlib.h>

#include<string.h>

#include<string>

#include<vector>

#include<queue>

#include<list>

using namespacestd;

typedef longlonglld;

typedef unsignedintud;

#define InfINT_MAX//int最大

#define Min(x,y)(x)<(y)?(x):(y)

#define Max(x,y)(x)>(y)?(x):(y)

#define PQpriority_queue

#define Qqueue

#define N102

struct Node

{

      intu,v;

      intw;

}edge[N];

int parent[N];

int n,m;

 

void Init()

{

      for(inti=0;i<n;i++)

           parent[i]=-1;

}

 

int find(intx)

{

      return parent[x]<0 ?x : find(parent[x]);

}

 

void merge(inta,intb)

{

    if(parent[r1]>parent[r2])
{

           parent[r1]=r2;

parent[r2]-=parent[r1];
}

    else
{

           parent[r2]=r1;

parent[r1]-=parent[r2];
}

}

 

int Kruskal()

{

      intsumW=0;

      Init();

      for(inti=0;i<m;i++)

      {

           intu=find(edge[i].u);

           intv=find(edge[i].v);

           if(u!=v)

           {

                 sumW+=edge[i].w;

                 merge(u,v);

           }

      }

      returnsumW;

}

 

bool cmp(Noden1,Noden2)

{

      returnn1.w<n2.w;

}

 

int main()

{

      while(cin>>n&&n)

      {

           m=0;

           for(intk=0;k<n-1;k++)

           {

                 charch;

                 chara;

                 intt;

                 cin>>a>>t;

                 if(t==0)

                      continue;

                 while(t--)

                 {

                      charb;

                      intw;

                      cin>>b>>w;

                      edge[m].u=a-'A';

                      edge[m].v=b-'A';

                      edge[m++].w=w;

                 }

           }

           sort(edge,edge+m,cmp);

           printf("%d\n",Kruskal());

      }

      return0;

}


0 0
原创粉丝点击