最小生成树之prim算法
注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。
从随便一个点开始(一般从v1)把这个点放到集合U里面
找出与这个点相连并且最短的边,且这条边的另一个点不在集合U里面
然后把这条边的另一个点放到集合U里面
然后继续从图中找出与集合U里面的点相连且最短的边
且这条边的另一个点不在集合U里面
并把与这条边相连又不在集合U里面的点放到集合U里面
重复上述
直到所有点都放在集合里面
#include<stdio.h>
#include<stdlib.h>
#define max 1000000000;
int LJJZ[101][101],JIHE[101],vis[101];
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d",&LJJZ[i][j]);///构图
}
}
JIHE[0]=1;
vis[1]=1;
int t=1;
int sum=0;
int min;
int minJ;
int flag;
while(t<n)
{
min=max;
flag=0;
for(i=0; i<t; i++)
{
for(j=1; j<=n; j++)
{
if(LJJZ[JIHE[i]][j]<min&&vis[j]==0)
{
min=LJJZ[JIHE[i]][j];
//printf("min:%d\n",min);
minJ=j;
flag=1;
}
}
}
if(flag==1)
{
sum=sum+min;
JIHE[t]=minJ;///集合U
//printf("JIHE:%d\n",JIHE[t]);
vis[minJ]=1;
t++;
}
}
printf("%d\n",sum);
return 0;
}