kruskal只与边有关,适合用于稀疏图。prim算法只与点有关,适合点比较少的稠密图。
kruskal算法复杂度是O(ElnV)
#include "stdio.h"
#include<string>
#include<algorithm>
using namespace std;
const int INF=999999;
const int MaxV=1000;
//prim
int lowcost[MaxV];
int matrix[MaxV][MaxV];
bool visit[MaxV];
//kruskal
int sum,nodeNum,edgeNum;
int root[MaxV];
int heavy[MaxV];
struct Edge
{
int u;
int v;
int value;
}edge[MaxV];
bool cmp(const Edge & a,const Edge & b)
{
return a.value<b.value;
}
void prim()
{
int i , j , u , temp;
memset(visit , false,sizeof(visit));
for(i=1;i<=nodeNum;i++)
lowcost[i]=matrix[1][i];
visit[1]=true;
for(i=1;i<=nodeNum;i++)
{
temp=INF;
for(j=1;j<=nodeNum;j++)
if(!visit[j]&&temp>lowcost[j])
{
temp = lowcost[j];
u = j;
}
visit[u]=true;
if(temp==INF)
break;
sum+=temp;
for(j=1;j<=nodeNum;j++)
if(!visit[j]&&lowcost[j]>matrix[u][j])
lowcost[j]=matrix[u][j];
}
}
int findRoot(int i)
{
return root[i]==i?i:findRoot(root[i]);
}
bool join(int x,int y)
{
int root1 = findRoot(x);
int root2 = findRoot(y);
if(root1==root2) return false;
if(heavy[root1]>=heavy[root2])
{
root[root2]=root1;
heavy[root1]+=heavy[root2];
}
else
{
root[root1]=root2;
heavy[root2]+=heavy[root1];
}
return true;
}
int main()
{
FILE *fp = freopen("data.txt","r",stdin);
int i,edgeTotal;
while(scanf("%d%d",&nodeNum,&edgeNum)!=EOF)
{
for(i=1;i<=edgeNum;i++)
{
root[i]=i;
heavy[i]=i;
}
for(i=1;i<=edgeNum;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].value);
}
sort(edge+1,edge+1+edgeNum,cmp);
edgeTotal = 0;
for(i=1;i<=edgeNum;i++)
{
if(join(edge[i].u,edge[i].v))
{
sum+=edge[i].value;
++edgeTotal;
// printf("%d->%d:%d\n",edge[i].u , edge[i].v,edge[i].value);
}
if(edgeTotal==nodeNum-1)
break;
}
if(edgeTotal==nodeNum-1)
printf("%d\n",sum);
else
printf("no MST/n");
}
return 0;
}