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,Node n2)
{
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;
}